0

所以,由于我显然太笨了,无法自己解决这个问题,所以我会在 SO 上问你们更好的人。

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

....,
{
 "id": 12345

 ....

 "policy_subjects": [
   {
     "compiled":  "^(user|max|anonymous)$",
     "template":  "<user|max|anonymous>"
   },
   {
     "compiled":  "^max$",
     "template":  "max"
   }
 ]
....
}

编译是一个“编译”的正则表达式

模板是没有正则表达式修饰符的相同正则表达式


我想要的是在 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”。

有谁知道如何做这个相对简单的查询?

4

1 回答 1

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=> 更改为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您想要的一个文档的逻辑可能对您的用例有点主观,所以我不确定正确的答案是什么,但您可以使用它.reduce(...)来返回最正确的值。

于 2016-02-09T18:37:32.667 回答