2015-04-21 3 views
0

Мне нужно запросить документы с помощью mongoDb, содержащие вложенные массивы. Я вижу много примеров, используя простой оператор $ in. Единственная проблема в том, что я строго должен проверять правильные подмножества.MongoDB Query Nested Array Search

Рассмотрите следующий документ.

{data: [[1,2,3], [4,5,6]]} 

Запрос должен быть в состоянии получить документы со всеми [1,2,3], где 1,2,3 может быть в любом порядке, что исключает следующий запрос, поскольку он соответствует только в правильном порядке.

{data:{$elemMatch:{$all:[[1,2,3]]}}} 

Я также попытался вложенные операторы $ elemMatch без успеха, потому что $ в операторе будет возвращать документ, даже если только один элемент соответствует, например, как в следующем.

{data:{$elemMatch:{$elemMatch:{$in:[1,4]}}}} 

ответ

0

Не уверен, что ваш фактический запрос выглядит, но это должно делать то, что вам нужно: db.documentDto.find ({ "строку field": { "$ elemMatch": { "$ в": [1 2,3]}}})

+0

Пожалуйста, вернитесь назад и внимательно перечитать мой вопрос. Особенно, когда я прямо указываю: «Единственная проблема в том, что я строго должен проверять правильные подмножества». –

+0

Хорошо для части «подмножества» вашего вопроса, посмотрели ли вы на «setIsSubset»? http://docs.mongodb.org/manual/reference/operator/aggregation/setIsSubset/ – snolan

0

Я не получил полного ответа (и не так много времени, как его поздно здесь), но я хотел бы рассмотреть

  1. Использование агрегирования трубопровода вместо запроса, если ваш еще не
  2. Используйте $ unwind operator для деконструирования ваших вложенных массивов
  3. Используйте $ sort для сортировки содержимого массивов - так что теперь вы можете сравнить
  4. Используйте $ match, чтобы отфильтровать массивы, которые не соответствуют значениям подмножества массива, как вы теперь можете проверить по заказу.
  5. Использование $ группы в группу результат обратно вместе на основе значения _ID

Ref: http://docs.mongodb.org/manual/reference/operator/aggregation-pipeline/ даст вам информацию о каждом из выше.

От быстрого поиска я пришел с подобным вопросом/например, которые могут быть полезны: Mongodb sort inner array

+0

Я бы предпочел, чтобы функция поиска, которая используется, преобразует запрос в агрегацию. Единичный тест тестирует только вставку документа, поэтому я могу просто пойти и использовать вместо этого агрегацию. Я подумаю об этом и жду, чтобы увидеть, есть ли возможное решение с помощью запросов. –

+0

Я не мог видеть способ сделать это с помощью find(), поэтому я предложил агрегацию. Я считаю, что, используя схему выше, вы должны быть способны достичь того, что хотите. – nomDePlum