Mongo: encontre itens que não tenham um determinado campo

107

Como procurar documentos em uma coleção que não contenha um determinado campo no MongoDB?

bcmcfc
fonte

Respostas:

171

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.

Andrew Orsich
fonte
1
Esteja avisado, as $existconsultas não podem usar índices (consulte mongodb.org/display/DOCS/… ).
Theo
4
@Theo: A partir do MongoDB 2.0 $ existe é capaz de usar índices ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich
Eu estava atrás disso para o Mongoid usar em um escopo. É assim>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs de
50

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.

nilskp
fonte
1
No entanto, alguém lendo o código pode interpretá-lo como o campo deve ser igual a 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!
Yeti
@Yeti se meu objetivo é encontrar todos os objetos que estão faltando um valor para o campo 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.
nilskp