2012-06-21 5 views
0

Je souhaite interroger mongodb pour les documents contenant un tableau de sorte que tous ses éléments soient membres d'un tableau donné par l'utilisateur. En d'autres termes, je dois sélectionner des documents dont le tableau est un sous-ensemble d'un tableau donné. Par exemple, si j'ai cette collection:Comment rechercher des documents avec un attribut de tableau contenu dans un tableau donné

> db.foos.find() 
{ "_id" : ObjectId("4fe3901d0add2727c3adc7ca"), "tags" : [ "a", "b", "c" ] } 
{ "_id" : ObjectId("4fe390220add2727c3adc7cb"), "tags" : [ "a", "b" ] } 
{ "_id" : ObjectId("4fe390250add2727c3adc7cc"), "tags" : [ "a" ] } 
{ "_id" : ObjectId("4fe390250add2727c3adc7cd"), "tags" : [ "c" ] } 

Et mon code a été donné le tableau ["a", "b", "z"], je veux une requête qui produit le résultat suivant:

> db.foos.find(THE_QUERY!) 
{ "_id" : ObjectId("4fe390220add2727c3adc7cb"), "tags" : [ "a", "b" ] } 
{ "_id" : ObjectId("4fe390250add2727c3adc7cc"), "tags" : [ "a" ] } 

Et ces documents ont été sélectionnés parce que les deux ["a", "b"] et ["a"] sont des sous-ensembles de ["a", "b", "z"].

Répondre

0

Cette réponse ne résout pas le problème d'OP. Selon les commentaires, la fonctionnalité nécessaire n'est pas actuellement présente dans MongoDB. Je laisse cela pour une histoire de commentaires

Vous voulez utiliser le $in advanced query:

Le $ dans l'opérateur est analogue à SQL modificateur, vous permettant de spécifier un tableau de correspondances possibles .

Cela dit: « Tout document foos qui a une valeur de balises dans ce tableau donné »

db.foos.find({tags: {$in: ["a", "b", "z"]}}) 

Si vous voulez trouver un document qui coupe spécifiquement tous les éléments avec un tableau donné, vous pouvez utiliser $all:

le $ tout opérateur est similaire à $, mais au lieu de faire correspondre une valeur dans le tableau spécifié toutes les valeurs de la matrice doit être adaptée.

Cela dit: « Tout document foos ayant un réseau de balises contenant tous ces éléments »

db.foos.find({tags: {$all: ["a", "b", "z"]}}) 
+0

non, cela ne produit pas ce qu'il cherche. –

+0

@WesFreeman: Je l'ai changé pour l'opérateur $ in. Pour une raison quelconque, j'ai jeté un coup d'œil sur ses exemples et j'ai pensé qu'il voulait une intersection. $ – jdi

+0

$ ne fait pas ce qu'il veut, car il renvoie le document avec "c" –

Questions connexes