RETHINKDB查询过滤器针对单键的多个值



HER是我的示例DB,其中有3行

{type:"a", info:""}
{type:"b", info:""}
{type:"c", info:""}

使用Rethink DB我将如何列出所有类型的值A或B

//这是我的第一个解决方案,但我无法动态构建

r.table("example").filter(r.row("type").eq("a").or("b")).run(conn, function(err, results){...});

所以,如果下次我想要A型和C,我会遇到麻烦。我需要一种构建查询的方法。食谱示例对我来说并不重要。有什么想法吗?

您写了r.row('type').eq('a').or('b'),但这并不能做您的期望。

您可能想要r.row('type').eq('a').or(r.row('type').eq('b'))

您也可以写r.expr(['a', 'b']).contains(r.row('type'))

我发现,由于过滤器只是一个对象,所以我只能拥有

var filter;
filter = r.row("type").eq('a');

,如果我想向其中添加更多内容,那么您只需在过滤器上添加和/或OP即可。 filter = filter.and(...(;

提供一个使用匹配的过滤函数来测试值与正则表达式测试值更简单。

let query = r.table('yourdata').filter(row => row('yourfield').match('a|b'));
query.run(conn).then(results => { ... }).catch(err => { ... });

在2022年,使用过滤器和匹配要容易得多,如@besworks所建议。

在RQL Data Explorer语法中:

r.db("groceries").table("fruit")
  .filter(r.row("type").match("apples|bananas|grapes"))

这允许简单的链条和逻辑门表达式:

r.db("groceries").table("fruit")
  .filter(r.row("type").match("apples|bananas|grapes"))
  .filter(
    r.row("kind").match("fuji|concord").and(
    r.row("kind").match("plantain|gala|cotten_candy").not()
  ))

我正在回答这个问题,因为我发现自己每年10次回到这篇文章,从不有效地得到答案。

r.db("db").table("table").filter(function (user) {
  return r.expr(['a', 'b']).contains(user('type'))
})

我稍后会感谢自己。

最新更新