2016-03-22 7 views
3

Как связать несколько условий в RethinkDB? Это то, что я получил прямо сейчас, и что работает, если я только передаю liveилиsports в качестве параметра. Как только я передаю параметр live и sports, sports, очевидно, всегда перезаписывает переменную filter, а параметр live игнорируется.Динамические условия цепного фильтра

app.get('/bets', function (req, res) { 
    var live = req.query.live; 
    var sports = req.query.sports; 

    var filter = {}; 

    if (live === undefined) { 
     filter = r.or(r.row('live').eq(0), r.row('live').eq(1)); 
    } else { 
     filter.live = parseInt(live); 
    } 

    if (sports !== undefined) { 
     var sports = sports.split(','); 
     filter = function (doc) { 
      return r.expr(sports).contains(doc("sport")); 
     } 
    } 

    r.table('bets').filter(filter).limit(100).run(connection, function(err, cursor) { 
     // ... 
    }); 
}); 
+0

Все еще не мог заставить его работать, никаких идей? – Chris

ответ

2

Вы можете связать фильтры с помощью RethinkDB.

Что-то вдоль линий этого (предупреждение, непроверенных):

app.get('/bets', function (req, res) { 
    var live = req.query.live; 
    var sports = req.query.sports; 

    var liveFilter, sportFilter; 

    if (live === undefined) { 
     liveFilter = r.or(r.row('live').eq(0), r.row('live').eq(1)); 
    } else { 
     liveFilter = function (doc) { return true; }; 
    } 

    if (sports !== undefined) { 
     sports = sports.split(','); // no need to redefine the variable here 
     sportFilter = function (doc) { 
      return r.expr(sports).contains(doc("sport")); 
     } 
    } else { 
     sportFilter = function (doc) { return true; }; 
    } 

    r.table('bets') 
    .filter(liveFilter)  // apply the first filter 
    .filter(sportsFilter) // apply the second filter 
    .limit(100) 
    .run(connection, function(err, cursor) { 
     // ... 
    }); 
}); 

В качестве альтернативы вы могли бы сделать одну функцию фильтра, который будет обрабатывать как живые и спортивные фильтры (одинаково непроверенные, это, чтобы вы начали) :

app.get('/bets', function (req, res) { 
    var live = req.query.live; 
    var sports = req.query.sports.split(','); 

    var filter = function(doc){ 
     var sportPass, livePass; 

     if (live === undefined) { 
      livePass = r.or(r.row('live').eq(0), r.row('live').eq(1))(doc); 
     } else { 
      livePass = parseInt(live); // not sure what you meant by filter.live here 
     } 

     if (sports !== undefined) { 
      sportPass = r.expr(sports).contains(doc("sport")); 
     } 

     return sportPass && livePass; 
    }; 


    r.table('bets').filter(filter).limit(100).run(connection, function(err, cursor) { 
     // ... 
    }); 
}); 
+2

Первый подход работал отлично. Спасибо! – Chris

Смежные вопросы