Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /

$exists (operador de predicado da query)

$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.

Observação

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

Para o MongoDB 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: 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

Observação

As expressões não suportam o operador $exists. Para verificar a existência de um campo em uma expressão, você pode usar o operador de agregação $type para verificar se um campo tem um tipo de missing.

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

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.

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.

Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações 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.stockSales.countDocuments( { auditDate: { $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.

Voltar

Tipo de Dados

Nesta página