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 $existsretornará truemesmo que o campo seja nulo, o que muitas vezes não é o resultado desejado e pode levar a um NPE.
nulle 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: falseque 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é nullou porque aestá faltando, então $existsnão é bom o suficiente, uma vez que não vai pegar os casos em que aé null.
$existconsultas não podem usar índices (consulte mongodb.org/display/DOCS/… ).