2016-03-22 17 views
3

Wie verketten Sie mehrere Bedingungen in RethinkDB? Das ist, was ich gerade habe und was funktioniert, wenn ich nur liveodersports als Parameter übergebe. Sobald ich die Parameter live und sports übergebe, überschreibt sports offensichtlich immer die filter Variable und der live Parameter wird ignoriert.Dynamische Kettenfilterbedingungen

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

Immer noch konnte es nicht funktionieren, irgendwelche Ideen? – Chris

Antwort

2

Sie können Filter mit RethinkDB verketten.

Etwas nach dem Vorbild dieser (Warnung, ungetestet):

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) { 
     // ... 
    }); 
}); 

Alternativ können Sie eine Filterfunktion machen, dass die Live-und Sport beiden Filter würden behandeln (ebenfalls nicht getestet, das sind Sie den Einstieg) :

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

Erste Annäherung hat gut funktioniert. Vielen Dank! – Chris