Definição
- $exists
- O 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 SQL- exists. Para o- existsSQL, 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: 0como 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:
| $existsQuery | 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 valor- auditDatenulo.
- 5está faltando o valor- auditDate.
 
- 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.