Respuestas:
Sí, es posible usar $ existe :
db.things.find( { a : { $exists : false } } ); // return if a is missing
Cuando es verdadero, $ existe coincide con los documentos que contienen el campo, incluidos los documentos donde el valor del campo es nulo. Si es falso, la consulta devuelve solo los documentos que no contienen el campo.
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Si no le importa si falta el campo o null
(o si nunca lo es null
), puede usar el un poco más corto y seguro:
db.things.find( { a : null } ); // return if a is missing or null
Es más seguro porque $exists
regresará true
incluso si el campo es nulo, lo que a menudo no es el resultado deseado y puede conducir a una NPE.
null
y no faltar. Este es un comportamiento realmente inesperado, porque no podría hacer lo mismo para 0
(que también lo es false
), por lo que null
es una especie de excepción aquí. Por lo tanto, la mejor práctica es la respuesta más legible $exists: false
que no sea ambigua. Recuerde, su variante un poco más corta no es realmente más corta si necesita tener ese comentario detrás.
a
, ya a
sea null
porque a
falta o porque falta, entonces $exists
no es lo suficientemente bueno, ya que no detectará los casos donde a
está null
.
$exist
consultas no pueden utilizar índices (consulte mongodb.org/display/DOCS/… ).