2011-03-20 2 views
140

J'utilise mongodb maintenant.Comment vérifier si un champ de tableau contient une valeur unique ou un autre tableau dans MongoDB?

J'ai une collection de blogpost, et blogpost a un tag 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 searchs

  1. CONTAINS balise1 '
  2. contient [ 'balise1', 'tag2'],
  3. contient l'une des [ 'tag3', « TAG4 « ]

Répondre

218

Essayez ceci:

db.blogpost.find({ 'tags' : 'tag1'}); //1 
db.blogpost.find({ 'tags' : { $all : [ 'tag1', 'tag2' ] }}); //2 
db.blogpost.find({ 'tags' : { $in : [ 'tag3', 'tag4' ] }}); //3 
+6

Ceci est bien documenté dans l'aide: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24all –

+2

pour le $ tout cela signifie tous les éléments ET dans l'ordre ou est c'est juste non ordonné? – redben

+2

@ ScottHernandez Je ne vois pas qu'ils mentionnent que le champ que vous utilisez comme votre recherche peut être un tableau, et comment cela est géré. "field: {$ in: tableau}". Que se passe-t-il lorsque vous recherchez un tableau dans un tableau de tableaux? Non précisé. – Zut

5

Mon expérience est que pour (2) la solution suivante est beaucoup plus rapide que celui avec « $ tous »:

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

mais pour être honnête, je ne pas pourquoi. Cela m'intéresserait, si quelqu'un le sait.

+1

En passant, juste testé sur la liste des mots-clés indexés. Absolument le même résultat avec $ et and $ tous – isox

+0

Peut-être que cela a changé avec les versions plus récentes en attendant. – heinob

+0

C'est circonstanciel. Pour le "$ et", mongodb fait 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

Questions connexes