假设我有一个值为[x,y,z]
的动态数组A.
我想返回属性P具有A中存在的值的所有结果。
我可以编写一些递归过滤器,为A中的每个值连接'或',但它非常笨重。
还有其他开箱即用的方法吗?
答案 0 :(得分:1)
您可以将filter
命令与reduce
和contains
命令结合使用来完成此操作。
示例强>
我们假设您有以下文件:
{
"id": "41e352d0-f543-4731-b427-6e16a2f6fb92" ,
"property": [ 1, 2, 3 ]
}, {
"id": "a4030671-7ad9-4ab9-a21f-f77cba9bfb2a" ,
"property": [ 5, 6, 7 ]
}, {
"id": "b0694948-1fd7-4293-9e11-9e5c3327933e" ,
"property": [ 2, 3, 4 ]
}, {
"id": "4993b81b-912d-4bf7-b7e8-e46c7c825793" ,
"property": [ "b" ,"c" ]
}, {
"id": "ce441f1e-c7e9-4a7f-9654-7b91579029be" ,
"property": [ "a" , "b" , "c" ]
}
从这些序列中,您希望获取"a"
属性中包含1
或property
的所有文档。您可以使用reduce
编写一个返回链式contains
语句的查询。
r.table('30510212')
// Filter documents
.filter(function (row) {
// Array of properties you want to filter for
return r.expr([ 1, 'a' ])
// Insert `false` as the first value in the array
// in order to make it the first value in the reduce's left
.insertAt(0, false)
// Chain up the `contains` statement
.reduce(function (left, right) {
return left.or(row('property').contains(right));
});
})
更新:更好的方法
实际上,您可以使用2 contains
来执行相同的查询。这个更短,可能更容易理解。
r.table('30510212')
.filter(function (row) {
return row('property').contains(function (property) {
return r.expr([ 1, 'a' ]).contains(property);
})
})