сопоставление массива mongodb

Как выполнить следующее?

db.test.save( {a: [1,2,3]} );

db.test.find( {a: [1,2,3,4]} );  //must match because it contains all required values [1, 2, 3]
db.test.find( {a: [1,2]} );  //must NOT match because the required value 3 is missing

Я знаю о $in и $all, но они работают по-разному.


person srgstm    schedule 25.07.2012    source источник


Ответы (2)


Интересно.. Проблема в том, что операторы $in и $or применяются к элементам массива, который вы сравниваете с каждым документом в коллекции, а не к элементам массивов в документы.. Подводя итог вашему вопросу: вы хотите, чтобы это было совпадением, если какой-либо из документов в коллекции оказывается подмножеством переданного массива. Я не могу придумать способ сделать это, если вы не поменяете ввод и вывод. Я имею в виду следующее. Давайте возьмем ваш первый ввод:

db.test.find( {a: [1,2,3,4]} );

Попробуйте поместить это во временную коллекцию, например, temp как:

db.temp.save( {a: [1,2,3,4]} );

Теперь выполните итерацию по каждому документу в тестовой коллекции и «найдите» его во временном файле с помощью оператора $all, чтобы убедиться, что он полностью содержится, т. е. сделайте что-то вроде этого:

foreach(doc in test)
{ db.temp.find( { a: { $all: doc.a } } ); }


Это определенно обходной путь! Я не уверен, пропускаю ли я какого-либо другого оператора, который может выполнять эту работу.

person Aafreen Sheikh    schedule 27.07.2012

В настоящее время нет оператора, который будет находить документы с подмножеством значений. Предлагается улучшить добавление оператора $subset. Пожалуйста, не стесняйтесь голосовать за проблему в JIRA: https://jira.mongodb.org/browse/SERVER-974

Другие возможные обходные пути, которые могут не подойти для вашего варианта использования, могут включать уменьшение карты или новую структуру агрегации (доступную в MongoDB версии 2.2): http://docs.mongodb.org/manual/reference/aggregation/#_S_project

person Jenna    schedule 30.07.2012