Definición
$elemMatchEl operador
$elemMatchcoincide con documentos que contienen un campo de arreglo con al menos un elemento que cumple con todos los criterios de query especificados.
Compatibilidad
Puedes usar $elemMatch 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
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
Comportamiento
No se puede especificar una expresión
$whereen$elemMatchun.No se puede especificar una
$textexpresión de consulta en$elemMatchun.
Ejemplos
Coincidencia de elementos
Dados los siguientes documentos en la colección scores:
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }
La siguiente query coincide solo con aquellos documentos donde el arreglo results contiene al menos un elemento que es mayor o igual a 80 y menor que 85:
db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } )
La query devuelve el siguiente documento porque el elemento 82 es mayor o igual a 80 y menor que 85:
{ "_id" : 1, "results" : [ 82, 85, 88 ] }
Para obtener más información sobre cómo especificar múltiples criterios en los elementos de un arreglo, consulta Especifica múltiples condiciones para los elementos del arreglo.
Arreglo de documentos incrustados
Esta instrucción inserta documentos en la colección survey:
db.survey.insertMany( [ { "_id": 1, "results": [ { "product": "abc", "score": 10 }, { "product": "xyz", "score": 5 } ] }, { "_id": 2, "results": [ { "product": "abc", "score": 8 }, { "product": "xyz", "score": 7 } ] }, { "_id": 3, "results": [ { "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }, { "_id": 4, "results": [ { "product": "abc", "score": 7 }, { "product": "def", "score": 8 } ] }, { "_id": 5, "results": { "product": "xyz", "score": 7 } } ] )
El documento con un _id de 5 no contiene un arreglo. Ese documento se incluye para demostrar que $elemMatch solo coincide con elementos del arreglo, los cuales verás en los siguientes ejemplos.
La siguiente query coincide con documentos donde results contiene al menos un elemento donde product es "xyz" y score es mayor o igual a 8:
db.survey.find( { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } } )
Específicamente, la query coincide con el siguiente documento:
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
Condición de query única
Las siguientes secciones muestran las diferencias de resultados cuando utiliza $elemMatch con una sola condición de query y omite $elemMatch.
Ejemplo 1
Query con $elemMatch:
db.survey.find( { results: { $elemMatch: { product: "xyz" } } } )
La query devuelve documentos donde cualquier product en results es "xyz":
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] } ]
Query sin $elemMatch:
db.survey.find( { "results.product": "xyz" } )
En la siguiente salida, observe que también se incluye el documento con un _id de 5 (que no contiene un arreglo):
[ { _id: 1, results: [ { product: 'abc', score: 10 }, { product: 'xyz', score: 5 } ] }, { _id: 2, results: [ { product: 'abc', score: 8 }, { product: 'xyz', score: 7 } ] }, { _id: 3, results: [ { product: 'abc', score: 7 }, { product: 'xyz', score: 8 } ] }, { _id: 5, results: { product: 'xyz', score: 7 } } ]
Ejemplo 2
Considera las siguientes queries:
La primera query tiene una única condición
<query>en$elemMatch.La segunda query omite
$elemMatch.
Primera query con $elemMatch:
db.survey.find( { "results": { $elemMatch: { product: { $ne: "xyz" } } } } )
La query devuelve documentos que tienen un product con un valor distinto de "xyz":
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] } { "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] } { "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] } { "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
Segunda query sin $elemMatch:
db.survey.find( { "results.product": { $ne: "xyz" } } )
La query devuelve documentos donde ninguno de los product results son "xyz":
{ "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "def", "score" : 8 } ] }
Ambas queries incluyen el documento con un _id de 4 y omiten el documento con un _id de 5 porque el product es "xyz".
Obtén más información
Para obtener más ejemplos sobre la consulta de arreglos, consulte:
Para obtener ejemplos adicionales sobre query, consulta Documentos de query.