Comment vérifier si un champ de tableau contient une valeur unique ou un autre tableau dans MongoDB?

143

J'utilise mongodb maintenant.

J'ai une collection d'articles de blog, et l'article de blog a une balise classée qui est un tableau, par exemple

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

Comment puis-je faire ces recherches

  1. contient "tag1"
  2. contient ['tag1', 'tag2'],
  3. contient l'un des ['tag3', 'tag4']
guilin 桂林
la source

Réponses:

219

Essayez ceci:

db.blogpost.find({ 'tags' : 'tag1'}); //1
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3
Jeff l'ours
la source
6
Ceci est bien documenté dans l'aide: mongodb.org/display/DOCS/…
Scott Hernandez
2
pour le $ tout cela signifie-t-il tous les éléments ET dans l'ordre exprimé ou est-il simplement non ordonné?
redben
2
@ScottHernandez Je ne vois pas qu'ils mentionnent que le champ que vous utilisez pour votre recherche peut être un tableau et comment cela est géré. "champ: {$ in: array}". Que se passe-t-il lorsque vous recherchez un tableau dans un tableau de tableaux? Non précisé.
Zut
Y a-t-il un INDEXING que nous pouvons faire sur les tableaux pour arrêter la duplication? Si oui, veuillez indiquer comment.
Hitesh Joshi
1
@redben son non ordonné comme écrit dans la documentation: $ all opérateur DOCS . Lisez simplement la partie exemple et vous verrez.
Matthias B
5

Mon expérience est que pour (2) la solution suivante est beaucoup plus rapide que celle avec "$ all":

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

mais pour être honnête, je ne sais pas pourquoi. Je serais intéressé, si quelqu'un le sait.

Heinob
la source
1
Au fait, je viens de le tester sur une liste de mots-clés indexés. Absolument le même résultat avec $ et et $ all
isox
Peut-être que cela a changé avec les nouvelles versions entre-temps.
heinob
C'est circonstanciel. Pour les "$ et", mongodb effectue une opération "et" logique. Par conséquent, si la première expression est fausse, les secondes ne sont pas prises en compte. Cela signifie moins de traitement.
kubudi
Mais cela devrait aussi arriver avec '$ all', n'est-ce pas !?
heinob
1
$ all est probablement deux recherches sur un index, $ et est probablement une recherche avec une analyse séquentielle du résultat.
Evan Carroll