Réponses:
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.
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 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 $exists
retournera true
même si le champ est nul, ce qui n'est souvent pas le résultat souhaité et peut conduire à un NPE.
null
et 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 null
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 que a
is null
soit parce que a
est manquant, alors ce $exists
n'est pas assez bien, car il n'attrapera pas les cas où a
est null
.
$exist
requêtes ne peuvent pas utiliser d'index (voir mongodb.org/display/DOCS/… ).