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?

bcmcfc
la source

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.

Andrew Orsich
la source
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.

nilskp
la source
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