如何筛选属性具有包含在数组X中的值的结果

时间:2015-05-28 15:00:01

标签: rethinkdb

假设我有一个值为[x,y,z]的动态数组A. 我想返回属性P具有A中存在的值的所有结果。

我可以编写一些递归过滤器,为A中的每个值连接'或',但它非常笨重。

还有其他开箱即用的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以将filter命令与reducecontains命令结合使用来完成此操作。

示例

我们假设您有以下文件:

{
  "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"属性中包含1property的所有文档。您可以使用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);
    })
  })