为了账号安全,请及时绑定邮箱和手机立即绑定

RethinkDB - 使用 Match() 按相同数据集和表中的值过滤

RethinkDB - 使用 Match() 按相同数据集和表中的值过滤

Go
MM们 2021-12-07 19:38:00
所以,因为我显然太笨了,无法自己弄清楚这一点,所以我会在 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”不匹配。有谁知道如何做这个相对简单的查询?
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

你肯定想在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(...)用来只返回最右边的值。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信