Definição
$existsThe
$existsoperator matches documents that contain or do not contain a specified field, including documents where the field value isnull.Observação
O MongoDB
$existsnão corresponde ao operador SQLexists. Para SQLexists, consulte$in.Para o Atlas 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: 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.
Sintaxe
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.
Consultar dados no Atlas usando o Atlas Search
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.
Exemplos
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.
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.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.