Как проверить, содержит ли поле массива уникальное значение или другой массив в 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'} ] });

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


1
Кстати, только что проверил это в списке проиндексированных ключевых слов. Абсолютно тот же результат с $ и $ all
isox

Возможно это изменилось с более новыми версиями тем временем.
Хейноб

Это случайно. Для "$ and" mongodb делает логическую операцию "and". Поэтому, если первое выражение ложно, второе не учитывается. Это означает меньше обработки.
Кубуди

Но это должно произойти и с '$ all', не так ли?
Хейноб

1
$ all - это, вероятно, два поиска по индексу, $ и, вероятно, один поиск с последовательным сканированием результата.
Эван Кэрролл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.