¿Cómo buscar documentos en una colección a los que les falta un campo determinado en MongoDB?
107
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.
$exist
consultas no pueden utilizar índices (consulte mongodb.org/display/DOCS/… ).scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Si no le importa si falta el campo o
null
(o si nunca lo esnull
), puede usar el un poco más corto y seguro: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.fuente
null
y no faltar. Este es un comportamiento realmente inesperado, porque no podría hacer lo mismo para0
(que también lo esfalse
), por lo quenull
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
, yaa
seanull
porquea
falta o porque falta, entonces$exists
no es lo suficientemente bueno, ya que no detectará los casos dondea
estánull
.