Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$exists (query predicate operador)

$exists

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

Nota

MongoDB $exists no se corresponde con el operador exists SQL. Para SQL,exists consulte $in.

Para la búsqueda exists en Atlas, consulte exists (Operador de búsqueda de MongoDB) en la documentación de Atlas.

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.

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.

Para los datos almacenados en MongoDB Atlas, puedes utilizar el Atlas Search exists (Operador de búsqueda en MongoDB) operador cuando ejecutes $search queries. Ejecutar $exists después de $search es menos eficiente que ejecutar $search con el operador exists (Operador de búsqueda 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.

Los ejemplos de esta página utilizan datos del conjunto de datos de ejemplo sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación de MongoDB autogestionada, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.

Considera el siguiente ejemplo:

db.movies.find( { rated: { $exists: true, $nin: [ "R", "PG-13" ] } } ).limit(5)

Esta consulta selecciona 5 documentos en la movies colección donde rated existe el campo y su valor no es igual "R" a "PG-13" o.

La colección movies en la base de datos sample_mflix contiene documentos donde algunos campos están presentes y otros faltan. Por ejemplo, el campo rated existe en los documentos 11 y 455 y está ausente en los documentos 9 y 894 restantes.

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 consisten en 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' }
]

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

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. La colección movies contiene documentos donde el campo metacritic está presente en algunos documentos y ausente en otros. De los documentos 21,349, 6,964 tienen el campo metacritic y 14,385 no lo tienen.

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

    db.movies.createIndex(
    { metacritic: 1 },
    { name: "metacriticSparseIndex", sparse: true }
    )
  3. El siguiente ejemplo cuenta los documentos donde el campo metacritic tiene un valor (incluyendo nulo) y utiliza el índice disperso:

    db.movies.countDocuments( { metacritic: { $exists: true } } )

    El ejemplo devuelve 6964. La operación no cuenta los documentos a los que les falta el campo metacritic.

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 movies:

db.movies.countDocuments( { metacritic: { $ne: null } } )

El ejemplo devuelve 6964. Los documentos que no tienen el valor metacritic o que tienen un valor metacritic nulo no se tienen en cuenta.

Volver

Tipo de dato

En esta página