Definición
$elemMatchEl operador limita el contenido de
$elemMatchun<array>campo de los resultados de la consulta para que contenga solo el primer elemento que coincida con la$elemMatchcondición.
Consideraciones sobre el uso
Elemento devuelto
Tanto el operador $ como el operador $elemMatch proyectan el primer elemento coincidente de una matriz según una condición.
El operador proyecta el primer elemento de matriz coincidente de cada documento en una colección según alguna condición de la declaración de $ consulta.
El $elemMatch operador de proyección acepta un argumento de condición explícita. Esto permite realizar proyecciones basadas en una condición que no está en la consulta, o si se necesita realizar proyecciones basadas en varios campos de los documentos incrustados del array. Consulte Limitaciones de campos del array para ver un ejemplo.
Orden de campos
Independientemente del orden de los campos en el documento, la $elemMatch proyección de un campo existente devuelve el campo después de las otras inclusiones de campos existentes.
Por ejemplo, considera una colección players con el siguiente documento:
db.players.insertOne( { name: "player1", games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ], joined: new Date("2020-01-01"), lastLogin: new Date("2020-05-01") } )
La siguiente proyección devuelve el campo games después de los demás campos existentes incluidos en la proyección, aunque en el documento el campo aparece antes que los campos joined y lastLogin:
db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )
Es decir, la operación devuelve el siguiente documento:
{ "_id" : ObjectId("5edef64a1c099fff6b033977"), "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z"), "games" : [ { "game" : "abc", "score" : 8 } ] }
Restricciones
Las operaciones
db.collection.find()en vistas no con compatibles con el operador de proyección$elemMatch.No se puede especificar una
$textexpresión de consulta en$elemMatchun.
Ejemplos
Los ejemplos del $elemMatch operador de proyección suponen una colección schools con los siguientes documentos:
{ _id: 1, zipcode: "63109", students: [ { name: "john", school: 102, age: 10 }, { name: "jess", school: 102, age: 11 }, { name: "jeff", school: 108, age: 15 } ] } { _id: 2, zipcode: "63110", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 3, zipcode: "63109", students: [ { name: "ajax", school: 100, age: 7 }, { name: "achilles", school: 100, age: 8 }, ] } { _id: 4, zipcode: "63109", students: [ { name: "barney", school: 102, age: 7 }, { name: "ruth", school: 102, age: 16 }, ] }
Búsqueda de código postal
La siguiente operación consulta todos los documentos cuyo valor find() del zipcode campo 63109 sea. La $elemMatch proyección devuelve solo el primer elemento coincidente de la students matriz cuyo valor school del campo 102 sea:
db.schools.find( { zipcode: "63109" }, { students: { $elemMatch: { school: 102 } } } )
La operación devuelve los siguientes documentos que tienen zipcode igual a 63109 y proyecta la students matriz $elemMatch usando:
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] } { "_id" : 3 } { "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
Para el documento con
_idigual1a, lastudentsmatriz contiene varios elementos con elschoolcampo igual102a. Sin embargo, la proyección solo devuelve el primer elemento$elemMatchcoincidente de la matriz.El documento con
_idigual a3no contiene elstudentscampo en el resultado ya que ningún elemento en sustudentsmatriz coincide con la$elemMatchcondición.
$elemMatch con múltiples campos
La proyección puede especificar criterios en múltiples $elemMatch campos:
La siguiente operación consulta todos los documentos cuyo valor find() del zipcode campo 63109 sea. La proyección incluye el primer elemento coincidente de la students matriz donde el valor del school campo sea 102 y el age valor del campo sea mayor 10 que:
db.schools.find( { zipcode: "63109" }, { students: { $elemMatch: { school: 102, age: { $gt: 10} } } } )
La operación devuelve los tres documentos que tienen zipcode igual a 63109:
{ "_id" : 1, "students" : [ { "name" : "jess", "school" : 102, "age" : 11 } ] } { "_id" : 3 } { "_id" : 4, "students" : [ { "name" : "ruth", "school" : 102, "age" : 16 } ] }
El documento con _id igual a 3 no contiene el students campo ya que ningún elemento de la matriz coincide con los $elemMatch criterios.
Tip
$ (projection) operador