Respostas:
Sim, é possível usar $ exists :
db.things.find( { a : { $exists : false } } ); // return if a is missing
Quando verdadeiro, $ exists corresponde aos documentos que contêm o campo, incluindo documentos em que o valor do campo é nulo. Se for falso, a consulta retorna apenas os documentos que não contêm o campo.
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Se você não se importa se o campo está faltando ou null
(ou se nunca null
), você pode usar o um pouco mais curto e seguro:
db.things.find( { a : null } ); // return if a is missing or null
É mais seguro porque $exists
retornará true
mesmo que o campo seja nulo, o que muitas vezes não é o resultado desejado e pode levar a um NPE.
null
e não ausente. Este é realmente um comportamento inesperado, porque você não seria capaz de fazer o mesmo para 0
(que também é false
), então null
é uma espécie de exceção aqui. Portanto, a prática recomendada é a resposta mais legível usando o $exists: false
que não é ambíguo. Lembre-se de que sua variante ligeiramente mais curta não é realmente mais curta se você precisar ter esse comentário por trás dela!
a
, ou porque a
é null
ou porque a
está faltando, então $exists
não é bom o suficiente, uma vez que não vai pegar os casos em que a
é null
.
$exist
consultas não podem usar índices (consulte mongodb.org/display/DOCS/… ).