Definición
$existsEl operador
$existscoincide con documentos que contienen o no contienen un campo especificado, incluidos los documentos donde el valor del campo esnull.Nota
MongoDB
$existsno corresponde al operadorexistsSQL. Para SQL,existsconsulte$inoperador.Para Atlas Search,
existsconsulte el operador exists (Operador de búsqueda MongoDB) 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.
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. [1]
| [1] | Los usuarios ya no pueden utilizar el filtro de query $type: 0 como sinónimo de $exists:false. Para realizar las query en campos nulos o faltantes, consulta Query de campos nulos o faltantes. |
Consultar datos en Atlas mediante la búsqueda de Atlas
Para los datos almacenados en MongoDB Atlas, puede usar el operador de búsqueda de Atlas "existe" (operador de búsqueda de MongoDB) al ejecutar consultas$search. Ejecutar$existsdespués de$searchtiene menor rendimiento que ejecutar$searchcon el operador "existe" (operador de búsqueda de MongoDB).
Para obtener más información sobre la versión de Atlas Search de este operador, consulte exists (MongoDB Search Operator) operador en la documentación de Atlas.
Ejemplos
Existe y no es igual a
Considera el siguiente ejemplo:
db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )
Este query seleccionará todos los documentos de la colección inventory donde el campo qty existe y su valor no es igual a 5 ni 15.
Null Values
Los siguientes ejemplos usan una colección llamada spices con los siguientes documentos:
db.spices.insertMany( [ { saffron: 5, cinnamon: 5, mustard: null }, { saffron: 3, cinnamon: null, mustard: 8 }, { saffron: null, cinnamon: 3, mustard: 9 }, { saffron: 1, cinnamon: 2, mustard: 3 }, { saffron: 2, mustard: 5 }, { saffron: 3, cinnamon: 2 }, { saffron: 4 }, { cinnamon: 2, mustard: 4 }, { cinnamon: 2 }, { mustard: 6 } ] )
$exists: true
El siguiente query especifica el predicado de query saffron: { $exists: true }:
db.spices.find( { saffron: { $exists: true } } )
Los resultados consisten en aquellos documentos que contienen el campo saffron, incluido el documento cuyo campo saffron contiene un valor nulo:
{ saffron: 5, cinnamon: 5, mustard: null } { saffron: 3, cinnamon: null, mustard: 8 } { saffron: null, cinnamon: 3, mustard: 9 } { saffron: 1, cinnamon: 2, mustard: 3 } { saffron: 2, mustard: 5 } { saffron: 3, cinnamon: 2 } { saffron: 4 }
$exists: false
El siguiente query especifica el predicado de query cinnamon: { $exists: false }:
db.spices.find( { cinnamon: { $exists: false } } )
Los resultados consisten en aquellos documentos que no contienen el campo cinnamon:
{ saffron: 2, mustard: 5 } { saffron: 4 } { mustard: 6 }
Los usuarios ya no pueden utilizar el filtro de query $type: 0 como sinónimo de $exists:false. Para realizar las query en campos nulos o faltantes, consulta Query de campos nulos o faltantes.
Utilice un índice disperso para mejorar $exists el rendimiento
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:
Cree una colección
stockSales:db.stockSales.insertMany( [ { _id: 0, symbol: "MDB", auditDate: new Date( "2021-05-18T16:12:23Z" ) }, { _id: 1, symbol: "MDB", auditDate: new Date( "2021-04-21T11:34:45Z" ) }, { _id: 2, symbol: "MSFT", auditDate: new Date( "2021-02-24T15:11:32Z" ) }, { _id: 3, symbol: "MSFT", auditDate: null }, { _id: 4, symbol: "MSFT", auditDate: new Date( "2021-07-13T18:32:54Z" ) }, { _id: 5, symbol: "AAPL" } ] ) El documento con un
_idde:3tiene un valorauditDatenulo.5Falta el valorauditDate.
Crear un índice disperso en el campo
auditDate:db.getCollection( "stockSales" ).createIndex( { auditDate: 1 }, { name: "auditDateSparseIndex", sparse: true } ) El siguiente ejemplo cuenta los documentos donde el campo
auditDatetiene un valor (incluyendo nulo) y utiliza el índice disperso:db.stockSales.countDocuments( { auditDate: { $exists: true } } ) El ejemplo devuelve 5. El documento que carece del valor
auditDateno se contabiliza.
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 stockSales:
db.stockSales.countDocuments( { auditDate: { $ne: null } } )
El ejemplo devuelve 4. Los documentos que no tienen el valor auditDate o tienen un valor auditDate nulo no se cuentan.