web-dev-qa-db-fra.com

Comment faire une requête "PAS DANS" dans Mongo?

Voici mon document:

{ 
    title:"Happy thanksgiving",
    body: "come over for dinner",
    blocked:[
       {user:333, name:'john'},
       {user:994, name:'jessica'},
       {user:11, name: 'matt'},
    ]
}

Quelle est la requête pour trouver tous les documents qui n'ont pas l'utilisateur 11 dans "bloqué"?

44
TIMEX

Vous pouvez utiliser $ in ou $ nin pour "not in"

Exemple ...

> db.people.find({ crowd : { $nin: ["cool"] }});

Je mets un tas d'autres exemples ici: http://learnmongo.com/posts/being-part-of-the-in-crowd/

66
Justin Jenkins

Puisque vous comparez avec une seule valeur, votre exemple n'a en fait pas besoin d'une opération NOT IN. En effet, Mongo appliquera ses critères de recherche à chaque élément d'un sous-document de tableau. Vous pouvez utiliser l'opérateur NOT EQUALS, $ ne, pour obtenir ce que vous voulez car il prend la valeur qui ne peut pas apparaître dans la recherche:

db.myCollection.find({'blocked.user': {$ne: 11}});

Cependant, si vous avez beaucoup de choses qu'il ne peut pas égaler, c'est alors que vous utiliseriez l'opérateur NOT IN, qui est $ nin. Il prend un tableau de valeurs qui ne peuvent pas apparaître dans la recherche:

db.myCollection.find({'blocked.user': {$nin: [11, 12, 13]}});
30
Zugwalt

Voir http://docs.mongodb.org/manual/reference/operator/query/nin/#op._S_nin

db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )

Cette requête sélectionnera tous les documents de la collection d'inventaire où la valeur du champ qté n'est pas égale à 5 ni 15. Les documents sélectionnés incluront les documents qui ne contiennent pas le champ qté.

Si le champ contient un tableau, l'opérateur $ nin sélectionne les documents dont le champ contient un tableau sans élément égal à une valeur dans le tableau spécifié (par exemple, etc.).

2
Femi

Essayez ce qui suit:

db.stack.find({"blocked.user":{$nin:[11]}})

Cela a fonctionné pour moi.

2
kane