Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
query de elementos

$exists

$exists

El operador $exists coincide con documentos que contienen o no contienen un campo especificado, incluidos los documentos donde el valor del campo es null.

Nota

MongoDB $exists no corresponde al operador SQL exists. Para SQL exists, consulta la $in operador.

Para Atlas Search exists, consulta el exists-ref operador en la documentación de Atlas.

Tip

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.

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.

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.

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.

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 }
] )

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 }

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.

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 } y

  • El field tiene 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:

  1. 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 _id de:

    • 3 tiene un valor auditDate nulo.

    • 5 Falta el valor auditDate.

  2. Crear un índice disperso en el campo auditDate:

    db.getCollection( "stockSales" ).createIndex(
    { auditDate: 1 },
    { name: "auditDateSparseIndex", sparse: true }
    )
  3. El siguiente ejemplo cuenta los documentos donde el campo auditDate tiene 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 auditDate no se contabiliza.

Tip

Si solo se necesitan documentos en los que field tenga un valor no nulo:

  • Puede utilizar $ne: null en 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.

Volver

query de elementos

En esta página