Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$elemMatch (operador de proyección)

$elemMatch

El operador $elemMatch limita el contenido de un campo <array> de los resultados de la consulta para que contenga solo el primer elemento que coincida con la condición$elemMatch.

Tanto el operador $ como el operador $elemMatch proyectan el primer elemento coincidente de una matriz en función de una condición.

El operador $ proyecta el primer elemento de un arreglo coincidente de cada documento en una colección, según alguna condición de la instrucción de query.

El operador de proyección $elemMatch acepta un argumento de condición explícito. Esto permite proyectar en función de una condición que no esté en la consulta, o bien, proyectar en función de varios campos de los documentos incrustados en la matriz. Consulte Limitaciones de campos de matriz para ver un ejemplo.

Independientemente del orden de los campos en el documento, la proyección $elemMatch de un campo existente devuelve el campo después de las demás 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 retorna el campo games después de los otros campos existentes incluidos en la proyección, aunque en el documento, el campo está listado antes de 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 } ]
}

Los ejemplos sobre el operador de proyección $elemMatch presuponen 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 },
],
athletics: [ "swimming", "basketball", "football" ]
},
{
_id: 3,
zipcode: "63109",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
],
athletics: [ "baseball", "basketball", "soccer" ]
},
{
_id: 4,
zipcode: "63109",
students: [
{ name: "barney", school: 102, age: 7 },
{ name: "ruth", school: 102, age: 16 },
]
}

La operación devuelve los siguientes documentos que tienen un valor zipcode de "63109" y proyecta el array students usando $elemMatch:

{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
{ "_id" : 3 }
{ "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
  • Para el documento con _id igual a 1, el array students contiene varios elementos con el campo school igual a 102. Sin embargo, la proyección $elemMatch devuelve solo el primer elemento coincidente del array.

  • El documento con _id igual a 3 no contiene el campo students en el resultado ya que ningún elemento en su matriz students coincidió con la condición$elemMatch.

La proyección $elemMatch puede especificar criterios en múltiples campos.

La operación devuelve los tres documentos que tienen un valor zipcode de "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 campo students ya que ningún elemento de la matriz coincide con los criterios $elemMatch.

El argumento de $elemMatch coincide con los elementos del array que $elemMatch está proyectando. Si especifica una igualdad con un nombre de campo para $elemMatch, intentará coincidir con objetos dentro del array. Por ejemplo, $elemMatch intenta coincidir con objetos, en lugar de valores escalares, dentro del array para lo siguiente en la proyección:

Los ejemplos precedentes devuelven los documentos que tienen un valor de zipcode de "63109", pero estos documentos sólo incluyen el campo _id porque la operación de proyección no encontró elementos coincidentes.

La operación devuelve los tres documentos que tienen un valor de zipcode de "63109". Los documentos devueltos incluyen el campo _id y los elementos coincidentes del arreglo athletics, si los hay.

[
{ _id: 1 },
{ _id: 3, athletics: [ 'basketball' ] },
{ _id: 4 }
]

El documento con _id igual a 3 es el único documento que coincide con el criterio $elemMatch.

Tip

$ (projection) operador