Mongo: trouver des objets qui n'ont pas un certain champ


107

Comment rechercher des documents dans une collection qui ne contiennent pas un certain champ dans MongoDB?

Réponses:


171

Ouais, c'est possible en utilisant $ existe :

db.things.find( { a : { $exists : false } } ); // return if a is missing

Quand est vrai, $ existe correspond aux documents qui contiennent le champ, y compris les documents où la valeur du champ est nulle. Si la valeur est false, la requête ne renvoie que les documents qui ne contiennent pas le champ.


1
Attention, les $existrequêtes ne peuvent pas utiliser d'index (voir mongodb.org/display/DOCS/… ).
Theo

4
@Theo: À partir de MongoDB 2.0 $ existe est capable d'utiliser des index ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich

J'étais après cela pour Mongoid à utiliser dans une lunette. On dirait ça>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

Si vous ne vous souciez pas de savoir si le champ est manquant ou null(ou si ce n'est jamais null), vous pouvez utiliser le plus court et le plus sûr:

db.things.find( { a : null } ); // return if a is missing or null

C'est plus sûr car $existsretournera truemême si le champ est nul, ce qui n'est souvent pas le résultat souhaité et peut conduire à un NPE.


1
Cependant, quelqu'un qui lit le code peut l'interpréter car le champ doit être égal nullet non manquant. C'est en fait un comportement inattendu, car vous ne pourriez pas faire la même chose pour 0(ce qui l'est aussi false), c'est donc une nullsorte d'exception ici. Par conséquent, la meilleure pratique est la réponse la plus lisible en utilisant $exists: falsece qui n'est pas ambigu. N'oubliez pas que votre variante légèrement plus courte n'est pas réellement plus courte si vous avez besoin d'avoir ce commentaire derrière elle!
Yeti

@Yeti si mon objectif est de trouver tous les objets pour lesquels il manque une valeur pour field a, soit parce que ais nullsoit parce que aest manquant, alors ce $existsn'est pas assez bien, car il n'attrapera pas les cas où aest null.
nilskp
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.