Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$exists

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Consultar dados no Atlas usando o Atlas Search
  • Exemplos
  • Exists e Not Equal To
  • Valores nulos
  • Usar um índice esparso para melhorar o desempenho de $exists
$exists

O operador $exists combina documentos que contêm ou não um campo especificado, incluindo documentos em que o valor do campo é null.

Observação

O MongoDB $exists não corresponde ao operador SQL exists. Para SQL exists, consulte o operador $in.

Para o Atlas Search exists, consulte o operador exists na documentação do Atlas.

Dica

Veja também:

Você pode utilizar o $exists para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

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 onde o valor de campo é null. Se <boolean> for falso, a query retornará somente os documentos que não contêm o campo. [1]

[1] A partir do MongoDB 4.2, 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.

Para dados armazenados no MongoDB Atlas, você pode usar o operador do Atlas Search exists ao executar queries $search . Executar $exists após $search tem menos desempenho do que executar $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.

Considere o seguinte exemplo:

db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )

Esta query selecionará todos os documentos na collection inventory onde o campo qty existir e seu valor não for igual a 5 ou 15.

Os exemplos seguintes utilizam uma collection 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 }
] )

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 }

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 }

A partir do MongoDB 4.2, 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.

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 collection. Para melhorar o desempenho, crie um índice esparso no field como mostrado no seguinte cenário:

  1. Criar uma collection 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 valor auditDate nulo.

    • 5 está faltando o valor auditDate.

  2. Crie um índice esparso no campo auditDate:

    db.getCollection( "stockSales" ).createIndex(
    { auditDate: 1 },
    { name: "auditDateSparseIndex", sparse: true }
    )
  3. 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 collection 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.

← Operadores de query de elemento
$type →