Mongo: busque elementos que no tengan un campo determinado

107

¿Cómo buscar documentos en una colección a los que les falta un campo determinado en MongoDB?

bcmcfc
fuente

Respuestas:

171

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.

Andrew Orsich
fuente
1
Tenga en cuenta que las $existconsultas no pueden utilizar índices (consulte mongodb.org/display/DOCS/… ).
Theo
4
@Theo: A partir de MongoDB 2.0, $ existe es capaz de utilizar índices ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich
Estaba buscando esto para que Mongoid lo usara en un alcance. Se ve así>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs
50

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 $existsregresará trueincluso si el campo es nulo, lo que a menudo no es el resultado deseado y puede conducir a una NPE.

nilskp
fuente
1
Sin embargo, alguien que lea el código podría interpretarlo como que el campo debe ser igual nully 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 nulles una especie de excepción aquí. Por lo tanto, la mejor práctica es la respuesta más legible $exists: falseque no sea ambigua. Recuerde, su variante un poco más corta no es realmente más corta si necesita tener ese comentario detrás.
Yeti
@Yeti, si mi objetivo es encontrar todos los objetos a los que les falta un valor para el campo a, ya asea nullporque afalta o porque falta, entonces $existsno es lo suficientemente bueno, ya que no detectará los casos donde aestá null.
nilskp