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 MongoDB
$existsnão corresponde ao operador SQLexists. Para SQLexists, consulte$in.Para o MongoDB Search
exists, consulte exists (Operador do MongoDB Search) 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
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.
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.
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
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.
Exists e Not Equal To
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".
Valores nulos
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.
$exists: true
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' } ]
$exists: false
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 } ]
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:
A coleção
moviescontém documentos onde o campometacriticestá presente em alguns documentos e ausente em outros. Dos 21,349 documentos, 6,964 têm o campometacritice 14,385 não.Crie um índice esparso no campo
metacritic:db.movies.createIndex( { metacritic: 1 }, { name: "metacriticSparseIndex", sparse: true } ) O exemplo a seguir conta os documentos em que o campo
metacritictem 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: nullem 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.