Comment rechercher des documents dans une collection qui ne contiennent pas un certain champ dans MongoDB?
107
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.
$exist
requêtes ne peuvent pas utiliser d'index (voir mongodb.org/display/DOCS/… ).scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Si vous ne vous souciez pas de savoir si le champ est manquant ou
null
(ou si ce n'est jamaisnull
), vous pouvez utiliser le plus court et le plus sûr:C'est plus sûr car
$exists
retourneratrue
même si le champ est nul, ce qui n'est souvent pas le résultat souhaité et peut conduire à un NPE.la source
null
et non manquant. C'est en fait un comportement inattendu, car vous ne pourriez pas faire la même chose pour0
(ce qui l'est aussifalse
), c'est donc unenull
sorte d'exception ici. Par conséquent, la meilleure pratique est la réponse la plus lisible en utilisant$exists: false
ce 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!a
, soit parce quea
isnull
soit parce quea
est manquant, alors ce$exists
n'est pas assez bien, car il n'attrapera pas les cas oùa
estnull
.