Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$exists (operador de predicado da query)

$exists

The $exists operator matches documents that contain or do not contain a specified field, including documents where the field value is null.

Observação

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

Para o Atlas Search exists, consulte exists (Operador do MongoDB Search) na documentação do Atlas.

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

  • MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
  • 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

Observação

Expressions do not support the $exists operator. To check for the existence of a field in an expression, you can use the $type aggregation operator to check if a field has a type of missing.

Para obter mais informações, consulte a verificação de existência de $type.

To specify an $exists expression, use the following prototype:

{ field: { $exists: <boolean> } }

When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. If <boolean> is false, the query returns only the documents that do not contain the field.

For data stored in MongoDB Atlas, you can use the Atlas Search in Operator operator when running $search queries. Running $exists after $search is less performant than running $search with the in Operator operator.

To learn more about the Atlas Search version of this operator, see the in Operator operator in the Atlas documentation.

Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar este conjunto de dados em sua implantação do MongoDB autogerenciado, consulte Carregar o conjunto de dados de amostra. Se você fez alguma modificação nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.

Considere o seguinte exemplo:

db.movies.find( { rated: { $exists: true, $nin: [ "R", "PG-13" ] } } ).limit(5)

Esta query seleciona 5 documentos na coleção movies onde o campo rated existe e seu valor não é igual a "R" ou "PG-13".

A coleção movies no banco de dados sample_mflix contém documentos em que alguns campos estão presentes e outros ausentes. Por exemplo, o campo rated existe em 11,455 documentos e está ausente nos documentos 9,894 restantes.

A seguinte query especifica o predicado de query rated: { $exists: true }:

db.movies.find( { rated: { $exists: true } }, { _id: 0, title: 1, rated: 1 } ).limit( 3 )

Os resultados consistem em três documentos que contêm o campo rated:

[
{ title: 'The Great Train Robbery', rated: 'TV-G' },
{ title: 'A Corner in Wheat', rated: 'G' },
{ title: 'Traffic in Souls', rated: 'TV-PG' }
]

A seguinte query especifica o predicado de query rated: { $exists: false }:

db.movies.find( { rated: { $exists: false } }, { _id: 0, title: 1, year: 1 } ).limit( 3 )

Os resultados consistem em três documentos que não contêm o campo rated:

[
{
title: 'Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics',
year: 1911
},
{ title: 'Gertie the Dinosaur', year: 1914 },
{ title: 'In the Land of the Head Hunters', year: 1914 }
]

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:

  1. A coleção movies contém documentos onde o campo metacritic está presente em alguns documentos e ausente em outros. Dos 21,349 documentos, 6,964 têm o campo metacritic e 14,385 não.

  2. Crie um índice esparso no campo metacritic:

    db.movies.createIndex(
    { metacritic: 1 },
    { name: "metacriticSparseIndex", sparse: true }
    )
  3. O exemplo a seguir conta os documentos em que o campo metacritic tem um valor (inclusive nulo) e usa o índice esparso:

    db.movies.countDocuments( { metacritic: { $exists: true } } )

    O exemplo retorna 6964. A operação não conta os documentos que não possuem o campo metacritic.

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 movies:

db.movies.countDocuments( { metacritic: { $ne: null } } )

O exemplo retorna 6964. Os documentos que não possuem o valor metacritic ou que têm um valor metacritic nulo não são contados.