Как вы делаете запрос AND для массива в mongodb?
У меня есть массив с тегами, который является частью документа, например, ["красный", "зеленый", "синий", "белый", "черный"]
Теперь я хочу найти все документы, которые имеют красный И синий.
2 ответа
Используйте условие $all, чтобы найти записи, которые соответствуют как "красным", так и "синим" условиям.
db.my_collection.find({tags: { $all : ["red","blue"]}})
Если вы хотите, чтобы записи соответствовали либо "красному", либо "синему", вы можете использовать условие $in.
db.my_collection.find({tags: { $in : ["red","blue"]}})
Также в случае, если кто-то задается вопросом, как отменить поиск по элементам, то есть найти запись, которая совпадает как с "красным", так и с "синим" и НЕ соответствует "зеленому" и "белому", это можно сделать с помощью оператора $nin, который может быть очевидно, когда кто-то читает документы на $nin ( http://www.mongodb.org/display/DOCS/Advanced+Queries - для меня было сложно разобрать описание):
db.my_collection.find({tags: { $all : ["red","blue"], $nin : ["green", "white" ]}})
Это очень круто, так как позволяет относительно хороший синтаксис поиска с отрицанием:
tokenRequired1 tokenRequired2 !tokenForbidden1 !tokenForbidden2
Очень естественный поиск в стиле Gmail.
Как и здесь и здесь, вы можете выполнить полнотекстовый поиск, если создадите массив всех токенов из записи, хотя я не знаю, насколько это эффективно или даже лучший способ сделать это.