RethinkDB - 在同一数据集中使用 Match() 按值过滤 table
RethinkDB - Filter using Match() by value in same dataset and table
所以,由于我太笨了,显然无法自己解决这个问题,所以我会在 SO 上请教你们更好的人。
基本上我有一个如下所示的数据结构:
....,
{
"id": 12345
....
"policy_subjects": [
{
"compiled": "^(user|max|anonymous)$",
"template": "<user|max|anonymous>"
},
{
"compiled": "^max$",
"template": "max"
}
]
....
}
已编译 是一个 "compiled" 正则表达式
模板 是没有正则表达式修饰符的同一个正则表达式
我想要的是使用 "compiled" 值在 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"。
有谁知道如何做这个相对简单的查询吗?
你肯定想在这里使用 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
更改为不匹配的其他内容,return 文档 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(...)
到 return 最右边的值。
所以,由于我太笨了,显然无法自己解决这个问题,所以我会在 SO 上请教你们更好的人。
基本上我有一个如下所示的数据结构:
....,
{
"id": 12345
....
"policy_subjects": [
{
"compiled": "^(user|max|anonymous)$",
"template": "<user|max|anonymous>"
},
{
"compiled": "^max$",
"template": "max"
}
]
....
}
已编译 是一个 "compiled" 正则表达式
模板 是没有正则表达式修饰符的同一个正则表达式
我想要的是使用 "compiled" 值在 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"。
有谁知道如何做这个相对简单的查询吗?
你肯定想在这里使用 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
更改为不匹配的其他内容,return 文档 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(...)
到 return 最右边的值。