2016-03-22 10 views
3

RethinkDBで複数の条件をチェーンする方法は?これは私が現在入手しているもので、私がパラメータとして渡すのはliveまたはsportsです。 livesportsパラメータを渡すと、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

関連する問題