Definición
$existsLa
$existsEl operador coincide con los documentos que contienen o no contienen un campo específico, incluidos los documentos donde el valor del campo esnull.Nota
MongoDB
$existsno se corresponde con el operador SQLexists. Para SQLexists, consultar$in.Para MongoDB Search
exists, consulta exists (operador de MongoDB Search) en la documentación de Atlas.
Compatibilidad
Puedes usar $exists para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Nota
Las expresiones no son compatibles con el $exists operador. Para verificar la existencia de un campo en una expresión, puedes usar el operador de agregación $type para comprobar si un campo tiene un tipo de missing.
Para más información, consulte $type Verificación de Existencia.
Sintaxis
Para especificar una expresión $exists, utiliza el siguiente prototipo:
{ field: { $exists: <boolean> } }
Cuando <boolean> es verdadero, $exists coincide con los documentos que contienen el campo, incluidos los documentos donde el valor del campo es null. Si <boolean> es falso, la query devuelve solo los documentos que no contienen el campo.
Consultar datos en Atlas con MongoDB
Para los datos almacenados en MongoDB Atlas, puedes usar el operador de búsqueda de MongoDB exists (operador de búsqueda de MongoDB) al ejecutar queries $search. Ejecutar $exists después de $search es menos eficiente que ejecutar $search con el operador exists (operador de búsqueda de MongoDB).
Para obtener más información sobre la versión de búsqueda de MongoDB de este operador, consulta el operador exists (operador de búsqueda de MongoDB) en la documentación de Atlas.
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Existe y no es igual a
Considera el siguiente ejemplo:
db.movies.find( { rated: { $exists: true, $nin: [ "R", "PG-13" ] } } ).limit(5)
Esta query selecciona 5 documentos en la colección movies donde el campo rated existe y su valor no es igual a "R" o "PG-13".
Null Values
La colección movies en la base de datos sample_mflix contiene documentos donde algunos campos están presentes y otros están ausentes. Por ejemplo, el campo rated existe en los documentos 11,455 y no está presente en los documentos restantes 9,894.
$exists: true
El siguiente query especifica el predicado de query rated: { $exists: true }:
db.movies.find( { rated: { $exists: true } }, { _id: 0, title: 1, rated: 1 } ).limit( 3 )
Los resultados constan de tres documentos que contienen el 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
El siguiente query especifica el predicado de query rated: { $exists: false }:
db.movies.find( { rated: { $exists: false } }, { _id: 0, title: 1, year: 1 } ).limit( 3 )
Los resultados consisten en tres documentos que no contienen el 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 } ]
Usa un índice disperso para mejorar el rendimiento de $exists
La siguiente tabla compara el rendimiento del query $exists utilizando índices dispersos y no dispersos:
$exists Query | Uso de un índice disperso | Using a Non-Sparse Index |
|---|---|---|
| El más eficiente. MongoDB puede hacer una coincidencia exacta y no requiere un | Más eficiente que los query sin un índice, pero aún requiere un |
| No se puede usar el índice y se requiere un | Se requiere un |
Los query que utilizan { $exists: true } en campos que usan un índice no disperso o que utilizan { $exists: true } en campos que no están indexados examinan todos los documentos de una colección. Para mejorar el rendimiento, cree un índice disperso en el field como se muestra en el siguiente caso:
La colección
moviescontiene documentos en los que el campometacriticestá presente en algunos documentos y ausente en otros. De los 21,349 documentos, 6,964 tienen el campometacriticy 14,385 no lo tienen.Crear un índice disperso en el campo
metacritic:db.movies.createIndex( { metacritic: 1 }, { name: "metacriticSparseIndex", sparse: true } ) El siguiente ejemplo cuenta los documentos donde el campo
metacritictiene un valor (incluyendo nulo) y utiliza el índice disperso:db.movies.countDocuments( { metacritic: { $exists: true } } ) El ejemplo devuelve 6964. La operación no toma en cuenta los documentos que carecen del campo
metacritic.
Tip
Si solo se necesitan documentos en los que field tenga un valor no nulo:
Puede utilizar
$ne: nullen lugar de$exists: true.No se necesita un índice disperso en el
field.
Por ejemplo, utilizando la colección movies:
db.movies.countDocuments( { metacritic: { $ne: null } } )
El ejemplo devuelve 6964. No se cuentan los documentos que carecen del valor metacritic o que tienen un valor nulo metacritic.