Как проверить, содержит ли поле массива уникальное значение или другой массив в MongoDB?

143

Я сейчас использую mongodb.

У меня есть коллекция blogpost, а blogpost содержит теги, которые представляют собой массив, например

blogpost1.tags = ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']
blogpost2.tags = ['tag2', 'tag3']
blogpost3.tags = ['tag2', 'tag3', 'tag4', 'tag5']
blogpost4.tags = ['tag1', 'tag4', 'tag5']

Как я могу сделать эти поиски

  1. содержит тег1
  2. содержит ['tag1', 'tag2'],
  3. содержит любой из ['tag3', 'tag4']
Гуйлинь 桂林
источник

Ответы:

219

Попробуйте это:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3
Джефф Медведь
источник
6
Это хорошо задокументировано в справке: mongodb.org/display/DOCS/…
Скотт Эрнандес
2
для $ all это означает все элементы И в выраженном порядке или это просто неупорядочено?
Redben
2
@ScottHernandez Я не вижу, чтобы они упоминали, что поле, которое вы используете для поиска, может быть массивом, и как это обрабатывается. msgstr "поле: {$ in: массив}". Что происходит, когда вы ищете массив в массиве массивов? Не указано.
Zut
Есть ли какие-либо УКАЗАНИЯ, которые мы можем сделать для массивов, чтобы остановить дублирование? Если да, пожалуйста, руководство, как.
Хитеш Джоши
1
@redben неупорядоченный, как написано в документе: $ all оператор DOCS . Просто прочитайте пример части, и вы увидите.
Матиас Б.
5

Мой опыт показывает, что для (2) следующее решение намного быстрее, чем решение с "$ all":

db.blogpost.find({ $and: [ {tags: 'tag1'} ,{tags: 'tag2'} ] });

но если честно я не за что. Мне было бы интересно, если кто-нибудь знает.

heinob
источник
1
Кстати, только что проверил это в списке проиндексированных ключевых слов. Абсолютно тот же результат с $ и $ all
isox
Возможно это изменилось с более новыми версиями тем временем.
Хейноб
Это случайно. Для "$ and" mongodb делает логическую операцию "and". Поэтому, если первое выражение ложно, второе не учитывается. Это означает меньше обработки.
Кубуди
Но это должно произойти и с '$ all', не так ли?
Хейноб
1
$ all - это, вероятно, два поиска по индексу, $ и, вероятно, один поиск с последовательным сканированием результата.
Эван Кэрролл