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 operador SQLexists. Para SQLexists, consulta la$inoperador.Para Atlas Search
exists, consulta el exists-ref operador 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. |
Query Data en Atlas utilizando Atlas Search
Para los datos almacenados en MongoDB Atlas, puedes usar el Atlas Search exists-ref operador cuando ejecutes $search consultas. Ejecutar $exists después de $search es menos eficiente que ejecutar $search con el operador exists-ref.
Para obtener más información sobre la versión de búsqueda Atlas de este operador, consulta el operador exists-ref 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.
Usa un índice disperso para mejorar el rendimiento de $exists
El siguiente escenario no es óptimo porque se examinan todos los documentos de la colección:
Se utiliza una query para recuperar o contar documentos, y
usar
field: { $exists: true }yEl
fieldtiene uníndice disperso o no tiene un índice.
Para mejorar el rendimiento, cree un índice disperso en el field como se muestra en el siguiente escenario:
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.