En MongoDB, puede usar $exists
operador de consulta de elemento para hacer coincidir documentos que contienen un campo específico.
También puede usarlo para hacer coincidir documentos que no contienen un campo específico.
También puede usarlo junto con otros operadores como $nin
para hacer coincidir documentos donde existe un campo dado, pero no contiene un valor específico.
Ejemplo
Supongamos que tenemos una colección llamada cats
que contiene los siguientes documentos:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Estos documentos son ligeramente inconsistentes con respecto a los campos que tienen. Algunos tienen un weight
campo, otros tienen una height
campo, algunos tienen un born
campo, etc
Podemos usar el $exists
operador para devolver documentos de esa colección que tienen un campo específico.
Ejemplo:
db.cats.find( { weight: { $exists: true } } )
Resultado:
{ "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Vemos que solo aquellos documentos que contienen un weight
se devuelven.
Campos que contienen null
El $exists
el operador incluye campos que contienen null
. No discrimina entre null
y no null
valores.
Ejemplo:
db.cats.find( { name: { $exists: true } } )
Resultado:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 }
Podemos ver que se devolvió el documento 5, aunque su name
el campo es null
.
Existe sin un valor específico
Puedes combinar $exists
con otros operadores para devolver documentos que contienen el campo, pero ese campo no contiene un valor específico.
Ejemplo:
db.cats.find( { weight: { $exists: true, $nin: [20,30] } } )
Resultado:
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
Este es un resultado diferente al que habríamos visto si simplemente hubiéramos usado $nin
sin el $exists
operador.
Así es como se vería:
db.cats.find( { weight: { $nin: [20,30] } } )
Resultado:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Documentos que no contienen un campo específico
Puedes usar $exists: false
para devolver documentos que no contener el campo especificado.
Ejemplo:
db.cats.find( { name: { $exists: false } } )
Resultado:
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
En este caso, un documento de la colección no contiene el name
campo.
Comprobar varios campos
Puede comprobar la existencia de varios campos separándolos con una coma.
Ejemplo:
db.cats.find( {
name: { $exists: true },
height: { $exists: true }
} )
Resultado:
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
Este ejemplo devuelve todos los documentos que contienen un name
campo y una height
campo.