Docs Menu
Docs Home
/ /

$elemMatch (proyección)

Tip

$elemMatch (query)

$elemMatch

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

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.

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 } ]
}
  • Las operaciones db.collection.find() en vistas no con compatibles con el operador de proyección $elemMatch.

  • No puede especificar un operador del query $text en un $elemMatch.

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

Puede modelar estos documentos utilizando las siguientes clases de C#:

public class School
{
public string Id { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
public Student[] Students { get; set; }
public string[] Athletics { get; set; }
}
public class Student
{
public string Id { get; set; }
public string Name { get; set; }
public int School { get; set; }
public int Age { get; set; }
}

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

Para realizar una proyección $elemMatch al usar el controlador .NET/C#, llame al método ElemMatch() en el generador de proyecciones. Pase el nombre del campo de la matriz al proyecto y el filtro que se aplicará a los elementos de la matriz.

El siguiente ejemplo de código busca todos los documentos cuyo valor del campo Zipcode sea "63109". Para cada documento coincidente, la proyección devuelve los siguientes campos:

  • Id

  • El primer elemento de la matriz Students en el que el valor del campo anidado School tiene el valor 102

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: school => school.Students,
filter: student => student.School == 102
)
).ToList();

La operación devuelve los siguientes documentos que tienen un zipcode valor de "63109" y proyecta la students matriz $elemMatch utilizando:

{ "_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 1 a, la students matriz contiene varios elementos con el school campo igual 102 a. Sin embargo, la proyección solo devuelve el primer elemento $elemMatch coincidente de la matriz.

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

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

El siguiente ejemplo de código busca todos los documentos cuyo valor del campo Zipcode sea "63109". Para cada documento coincidente, la proyección devuelve los siguientes campos:

  • Id

  • El primer elemento de la matriz Students en el que el valor del campo anidado School tiene el valor 102 y el campo Age tiene un valor mayor que 10

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: school => school.Students,
filter: student => (student.School == 102) && (student.Age > 10)
)
).ToList();

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 students campo ya que ningún elemento de la matriz coincide con los $elemMatch criterios.

El argumento coincide con los elementos del array $elemMatch que $elemMatch proyecta. Si se especifica una igualdad con un nombre de campo igual $elemMatch a, se intenta encontrar objetos dentro del array. Por ejemplo, $elemMatch intenta encontrar objetos, en lugar de valores escalares, dentro del array para lo siguiente en la proyección:

db.schools.find( { zipcode: "63109" },
{ athletics: { $elemMatch: { athletics: "basketball" } } })
var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
"athletics",
Builders<School>.Filter.Eq("athletics", "basketball"))
).ToList();

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

Para hacer coincidir valores escalares, utilice el operador de igualdad junto con el valor escalar que desea que coincida{$eq: <scalar value>} (). Por ejemplo, la siguiente operación busca todos los documentos cuyo valor find() del zipcode campo "63109" sea. La proyección incluye el elemento coincidente de la athletics matriz cuyo valor basketball es:

db.schools.find( { zipcode: "63109" },
{ athletics: { $elemMatch: { $eq: "basketball" } } })

Para realizar una operación $elemMatch con valores escalares en una matriz al usar el controlador .NET/C#, llame al método ElemMatch() en el generador de proyecciones. Pase el nombre del campo de la matriz a project y un filtro de igualdad para el campo "$eq" y el valor con el que desea comparar.

var results = schoolsCollection
.Find(s => s.ZipCode == "63109")
.Project(Builders<School>.Projection.ElemMatch(
field: "athletics",
filter: Builders<School>.Filter.Eq("$eq", "basketball"))
).ToList();

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 los $elemMatch criterios.

Tip

Volver

$

En esta página