Definição
$existsO operador
$existscorresponde a documentos que contêm ou não um campo especificado, incluindo documentos em que o valor do campo énull.Observação
O
$existsdo MongoDB não corresponde ao operador SQLexists. Para oexistsSQL, consulte o operador$in.Para o MongoDB Search
exists, consulte o operador exists (MongoDB Search Operator) na documentação do Atlas.
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 MongoDB Search
Para dados armazenados no MongoDB Atlas, você pode usar o operador do MongoDB Search exists (Operador do MongoDB Search) ao executar queries$search. Executar $exists após $search é menos eficiente que executar $search com o operador exists (MongoDB Search Operator).
Para saber mais sobre a versão do MongoDB Search desse operador, consulte o operador exists (MongoDB Search Operator) 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 sparse index para melhorar o desempenho de $exists
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 |
|---|---|---|
| Mais eficiente. O MongoDB pode fazer uma correspondência exata e não requer um | Mais eficiente que queries sem índice, mas ainda requer um |
| Não é possível usar o índice e exige um | Exige um |
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
_idde:3tem um valorauditDatenulo.5está 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
auditDatetem um valor (inclusive nulo) e usa o índice esparso:db.stockSales.countDocuments( { auditDate: { $exists: true } } ) O exemplo retorna 5. O documento sem o valor
auditDatenão é contado.
Dica
Se você precisar apenas de documentos em que field tenha um valor não nulo, você:
Pode usar
$ne: nullem 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.