как отфильтровать результаты, для которых свойство имеет значение, содержащееся в массиве X

Скажем, у меня есть динамический массив A значений [x,y,z]. Я хочу вернуть все результаты, для которых свойство P имеет значение, существующее в A.

Я мог бы написать какой-нибудь рекурсивный фильтр, который объединяет 'или' для каждого значения в A, но это очень неуклюже.

Есть ли другой нестандартный способ сделать это?


person Geert-Jan    schedule 28.05.2015    source источник


Ответы (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. Вы можете написать запрос, который возвращает связанный оператор contains, используя reduce.

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);
    })
  })
person Jorge Silva    schedule 28.05.2015
comment
Хмм хорошо. Мне удобно с уменьшением и т. д., но все еще выглядит довольно сложно. Спасибо хоть - person Geert-Jan; 28.05.2015