RethinkDB - 在同一数据集和表中使用Match()按值进行过滤

时间:2016-02-09 09:00:18

标签: go rethinkdb rethinkdb-javascript nosql

所以,既然我太愚蠢了,显然我自己也没弄清楚这一点,我会在这里问你们更好的人。

基本上我的数据结构如下所示:

....,
{
 "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”不匹配。

有谁知道如何进行这种相对简单的查询?

1 个答案:

答案 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}只返回最右边的值。