No MongoDB, você pode usar o
$exists
operador de consulta de elemento para corresponder a documentos que contêm um campo específico. Você também pode usá-lo para combinar documentos que não contêm um campo específico.
Você também pode usá-lo em conjunto com outros operadores como
$nin
para corresponder a documentos em que um determinado campo existe, mas não contém um valor específico. Exemplo
Suponha que tenhamos uma coleção chamada
cats
que contém os seguintes documentos:{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Esses documentos são ligeiramente inconsistentes em relação aos campos que possuem. Alguns têm um
weight
campo, outros têm uma height
campo, alguns têm um born
campo, etc. Podemos usar o
$exists
operador para retornar documentos dessa coleção que possuem um campo específico. Exemplo:
db.cats.find( { weight: { $exists: true } } )
Resultado:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Podemos ver que apenas os documentos que contêm um
weight
campo são retornados. Campos que contêm null
O
$exists
operador inclui campos que contêm null
. Não discrimina entre null
e não-null
valores. Exemplo:
db.cats.find( { name: { $exists: true } } )
Resultado:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Podemos ver que o documento 5 foi retornado, embora seu
name
campo é null
. Existe sem um valor específico
Você pode combinar
$exists
com outros operadores para retornar documentos que contêm o campo, mas esse campo não contém um valor específico. Exemplo:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Resultado:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Este é um resultado diferente daquele que teríamos visto se tivéssemos simplesmente usado
$nin
sem o $exists
operador. Veja como seria:
db.cats.find( { weight: { $nin: [20,30] } } )
Resultado:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Documentos que não contêm um campo específico
Você pode usar
$exists: false
para devolver documentos que não conter o campo especificado. Exemplo:
db.cats.find( { name: { $exists: false } } )
Resultado:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Nesse caso, um documento da coleção não contém o
name
campo. Verificar vários campos
Você pode verificar a existência de vários campos separando-os com uma vírgula.
Exemplo:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Resultado:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Este exemplo retorna todos os documentos que contêm um
name
campo e uma height
campo.