Как вы делаете запрос AND для массива в mongodb? - PullRequest
4 голосов
/ 21 декабря 2009

У меня есть массив с тегами, который является частью документа, например ["красный", "зеленый", "синий", "белый", "черный"]

Теперь я хочу найти все документы, которые имеют красный И синий.

Ответы [ 2 ]

11 голосов
/ 21 декабря 2009

Используйте условие $ all, чтобы найти записи, которые соответствуют условиям "красного" и "синего".

db.my_collection.find({tags: { $all : ["red","blue"]}})

Если вы хотите, чтобы записи соответствовали либо «красному», либо «голубому», вы можете использовать условие $ in.

db.my_collection.find({tags: { $in : ["red","blue"]}})
3 голосов
/ 18 ноября 2010

Также в случае, если кто-то задается вопросом, как отменить поиск по элементам, то есть найти запись, которая соответствует «красным» и «синим» и НЕ соответствует «зеленому» и «белому», это можно сделать с помощью $ nin оператор, который может быть неочевиден, когда кто-то читает документы $ nin (http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24nin - описание синтаксического анализа для меня было сложным):

db.my_collection.find({tags: { $all : ["red","blue"], $nin : ["green", "white" ]}})

Это очень круто, так как позволяет относительно хороший синтаксис поиска с отрицанием:

tokenRequired1 tokenRequired2 !tokenForbidden1 !tokenForbidden2

Очень естественный поиск в стиле Gmail.

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

...