所以,既然我太愚蠢了,显然我自己也没弄清楚这一点,我会在这里问你们更好的人。
基本上我的数据结构如下所示:
....,
{
"id": 12345
....
"policy_subjects": [
{
"compiled": "^(user|max|anonymous)$",
"template": "<user|max|anonymous>"
},
{
"compiled": "^max$",
"template": "max"
}
]
....
}
已编译是“已编译”的正则表达式
模板是没有regex-modifiers的正则表达式
我想要的是在RethinkDB中使用“编译”值进行简单查询并将其与字符串匹配,例如“max”。
Basically
r.table("regex_policies").filter(function(policy_row) {
return "max".match("(?i)"+policy_row("policy_subjects")("compiled"))
}
Is what i want to do (+case-insensitive search)
数据库中当然有很多policy_subjects,所以在这个例子中,结果应该是匹配“max”的整个数据集(1个结果)。由于“max”在这种情况下存在两次,并且它与两个正则表达式匹配(一次就足够了)。
在这个例子中,“foobar”同样会产生0个结果,因为任何编译的正则表达式都与“foobar”不匹配。有谁知道如何进行这种相对简单的查询?
答案 0 :(得分:1)
你肯定想在这里使用r.expr
,我得到了这个例子:
r.expr([{
"id": 12345,
"policy_subjects": [
{
compiled: "^(user|max|anonymous)$",
template: "<user|max|anonymous>"
},
{
compiled: "^max$",
template: "max"
}
]
}]).merge(function(policy_row) {
return {
"policy_subjects": policy_row("policy_subjects").filter(function(item){
return r.expr("max").match(r.expr("(?i)").add(item("compiled"))).ne(null);
})
}
})
将max
更改为其他不匹配的内容,会返回policy_subjects
内没有元素的文档。
例如,更改max
=&gt;到wat
(我最喜欢的测试字符串)看起来像这样:
.merge(function(policy_row) {
return {
"policy_subjects": policy_row("policy_subjects").filter(function(item){
return r.expr("wat").match(r.expr("(?i)").add(item("compiled"))).ne(null);
})
}
})
结果如下:
[
{
"id": 12345 ,
"policy_subjects": [ ]
}
]
我认为您缩减到所需的policy_subject
文档的逻辑可能对您的用例有点主观,所以我不确定正确答案是什么,但您可以使用{{1}只返回最右边的值。