Docs Menu
Docs Home
/ /

$exists

$exists

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

Nota

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

Para la búsqueda de MongoDB exists, consulta el operador exists (operador de búsqueda de MongoDB) 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.

Nota

Las expresiones no admiten el $exists operador. Para comprobar la existencia de un campo en una expresión, puede usar el $type operador de agregación para comprobar si un campo tiene el missing tipo.

Para más información, consulte $type Verificación de Existencia.

Para especificar una expresión $exists, utiliza el siguiente prototipo:

{ field: { $exists: <boolean> } }

Si <boolean> es verdadero, coincide con los documentos que contienen el campo, incluidos los documentos cuyo$exists valor null es. Si <boolean> es falso, la consulta solo devuelve los documentos que no contienen el campo.

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.

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 }

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

{ $exists: true }

El más eficiente. MongoDB puede hacer una coincidencia exacta y no requiere un FETCH.

Más eficiente que los query sin un índice, pero aún requiere un FETCH.

{ $exists: false }

No se puede usar el índice y se requiere un COLLSCAN.

Se requiere un FETCH.

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:

  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

Tipo de dato

En esta página