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'))
})
我稍后会感谢自己。