Como procurar documentos em uma coleção que não contenha um determinado campo no MongoDB?
107
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.
$exist
consultas não podem usar índices (consulte mongodb.org/display/DOCS/… ).scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
Se você não se importa se o campo está faltando ou
null
(ou se nuncanull
), você pode usar o um pouco mais curto e seguro:É 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.fonte
null
e não ausente. Este é realmente um comportamento inesperado, porque você não seria capaz de fazer o mesmo para0
(que também éfalse
), entãonull
é 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 porquea
énull
ou porquea
está faltando, então$exists
não é bom o suficiente, uma vez que não vai pegar os casos em quea
énull
.