$exists
Nesta página
Definição
$exists
O operador
$exists
corresponde a documentos que contêm ou não um campo especificado, incluindo documentos em que o valor do campo énull
.
Compatibilidade
Você pode utilizar o $exists
para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
Para especificar uma expressão $exists
, use o seguinte protótipo:
{ field: { $exists: <boolean> } }
Quando <boolean>
é verdadeiro, $exists
corresponde aos documentos que contêm o campo, incluindo documentos nos quais o valor de campo é null
. Se <boolean>
for falso, a query retornará somente os documentos que não contêm o campo. [1]
[1] | Os usuários não podem mais utilizar o filtro de query $type: 0 como sinônimo de $exists:false . Para consultar campos nulos ou ausentes, consulte Query para campos nulos ou ausentes. |
Consultar dados no Atlas usando o Atlas Search
Para dados armazenados no MongoDB Atlas, você pode utilizar o operador do Atlas Search exists ao executar queries $search
. A execução de $exists
após $search
tem menos desempenho do que a execução de $search
com o operador exists.
Para saber mais sobre a versão do Atlas Search desse operador, consulte o operador exists na documentação do Atlas.
Exemplos
Exists e Not Equal To
Considere o seguinte exemplo:
db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )
Esta query selecionará todos os documentos na coleção inventory
onde o campo qty
existir e seu valor não for igual a 5
ou 15
.
Valores nulos
Os exemplos seguintes utilizam uma coleção denominada spices
com os seguintes documentos:
db.spices.insertMany( [ { saffron: 5, cinnamon: 5, mustard: null }, { saffron: 3, cinnamon: null, mustard: 8 }, { saffron: null, cinnamon: 3, mustard: 9 }, { saffron: 1, cinnamon: 2, mustard: 3 }, { saffron: 2, mustard: 5 }, { saffron: 3, cinnamon: 2 }, { saffron: 4 }, { cinnamon: 2, mustard: 4 }, { cinnamon: 2 }, { mustard: 6 } ] )
$exists: true
A seguinte query especifica o predicado de query saffron: { $exists: true }
:
db.spices.find( { saffron: { $exists: true } } )
Os resultados consistem nos documentos que contêm o campo saffron
, incluindo o documento cujo campo saffron
contém um valor nulo:
{ saffron: 5, cinnamon: 5, mustard: null } { saffron: 3, cinnamon: null, mustard: 8 } { saffron: null, cinnamon: 3, mustard: 9 } { saffron: 1, cinnamon: 2, mustard: 3 } { saffron: 2, mustard: 5 } { saffron: 3, cinnamon: 2 } { saffron: 4 }
$exists: false
A seguinte query especifica o predicado de query cinnamon: { $exists: false }
:
db.spices.find( { cinnamon: { $exists: false } } )
Os resultados consistem nos documentos que não contêm o campo cinnamon
:
{ saffron: 2, mustard: 5 } { saffron: 4 } { mustard: 6 }
Os usuários não podem mais utilizar o filtro de query $type: 0
como sinônimo de $exists:false
. Para consultar campos nulos ou ausentes, consulte Query para campos nulos ou ausentes.
Usar um índice esparso para melhorar o $exists
desempenho de
A seguinte tabela compara o desempenho da query $exists
utilizando índices esparsos e não esparsos:
$exists Query | Usando um índice esparso | Usando um índice não esparso |
---|---|---|
{ $exists: true } | Mais eficiente. O MongoDB pode fazer uma correspondência exata e não requer um FETCH . | Mais eficiente que queries sem índice, mas ainda requer um FETCH . |
{ $exists: false } | Não é possível usar o índice e exige um COLLSCAN . | Exige um FETCH . |
Queries que utilizam { $exists: true }
em campos que utilizam um índice não escasso ou que utilizam { $exists: true }
em campos que não são indexados examinam todos os documentos em uma coleção. Para melhorar o desempenho, crie um índice esparso no field
como mostrado no seguinte cenário:
Crie uma coleção
stockSales
:db.stockSales.insertMany( [ { _id: 0, symbol: "MDB", auditDate: new Date( "2021-05-18T16:12:23Z" ) }, { _id: 1, symbol: "MDB", auditDate: new Date( "2021-04-21T11:34:45Z" ) }, { _id: 2, symbol: "MSFT", auditDate: new Date( "2021-02-24T15:11:32Z" ) }, { _id: 3, symbol: "MSFT", auditDate: null }, { _id: 4, symbol: "MSFT", auditDate: new Date( "2021-07-13T18:32:54Z" ) }, { _id: 5, symbol: "AAPL" } ] ) O documento com um
_id
de:3
tem um valorauditDate
nulo.5
está faltando o valorauditDate
.
Crie um índice esparso no campo
auditDate
:db.getCollection( "stockSales" ).createIndex( { auditDate: 1 }, { name: "auditDateSparseIndex", sparse: true } ) O exemplo a seguir conta os documentos em que o campo
auditDate
tem um valor (inclusive nulo) e usa o índice esparso:db.stockSales.countDocuments( { auditDate: { $exists: true } } ) O exemplo retorna 5. O documento sem o valor
auditDate
não é contado.
Dica
Se você precisar apenas de documentos em que field
tenha um valor não nulo, você:
Pode usar
$ne: null
em vez de$exists: true
.Não precisa de um índice esparso no
field
.
Por exemplo, utilizando a coleção stockSales
:
db.stockSales.countDocuments( { auditDate: { $ne: null } } )
O exemplo retorna 4. Os documentos que não possuem o valor auditDate
ou que têm um valor auditDate
nulo não são contados.