Как вы делаете запрос 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.

Как и здесь и здесь, вы можете выполнить полнотекстовый поиск, если создадите массив всех токенов из записи, хотя я не знаю, насколько это эффективно или даже лучший способ сделать это.

Другие вопросы по тегам