在RethinkDB中查找符合多个条件的文档

时间:2015-04-24 00:41:35

标签: function comparison rethinkdb

我想创建一个接受一系列需求的包装函数。此包装函数将向rethinkDB请求满足所有条件的任何文档。这些值将是数字,我想要返回任何有> =要求值的内容。

API中提供的语法如下:

r.table("name").filter(
r.row("cond1").lt(val1).and(r.row("cond2").gt(val2))
).run(conn, callback);

但这并不能让我查询任意数量的条件。

是否有我缺少的功能,或者是解决方案:  1.构建一个字符串并评估它 - 或 -  2.将函数传递给RethinkDB服务器,其中包含我的需求数组?

一个可能更有意义的例子:我有一个怪物卡车数据库。我想让某人说'#34;向我展示功率分数至少为5且速度至少为10"的卡车。这是传递函数失败的尝试:

r.db('test').table('monstertrucks').filter(
function(item){
var fail = 0, 
    arr = [{attr: "speed", val: 5}, {attr: "power", val: 10}];
for(var i = 0; i < arr.length; i++){
  if(item(arr[i].attr).lt(arr[i].val)){fail++}
}
return fail ? false : true;
})

1 个答案:

答案 0 :(得分:6)

RethinkDB并不只是在服务器上运行你的函数,它会调用你的函数一次来建立一个谓词。 (参见http://rethinkdb.com/blog/lambda-functions/。)您可以构建所需的谓词并将其返回:

r.db('test').table('monstertrucks').filter(function(item) {
  var pred = r.expr(true);
  arr = [{attr: "speed", val: 5}, {attr: "power", val: 10}];
  for (var i = 0; i < arr.length; i++) {
    pred = pred.and(item(arr[i].attr).lt(arr[i].val));
  }
  return pred;
}