Definição
$elemMatchO operador
$elemMatchlimita o conteúdo de um campo<array>dos resultados da query para conter apenas o primeiro elemento que corresponda à condição$elemMatch.
Considerações de uso
Elemento retornado
O operador $ e também o operador $elemMatch projetam o primeiro elemento correspondente de uma array com base em uma condição.
O operador $ projeta o primeiro elemento de array correspondente de cada documento em uma collection com base em alguma condição da declaração de query.
O operador de projeção $elemMatch usa um argumento de condição explícita. Isso permite que você projete com base em uma condição que não esteja na query ou, se precisar projetar, com base em vários campos nos documentos incorporados da array. Consulte as Limitações de campos da array para ver um exemplo.
Ordem do campo
Independentemente da ordenação dos campos no documento, a projeção $elemMatch de um campo existente retorna o campo após as outras inclusões de campo existentes.
Por exemplo, considere uma collection players com o seguinte 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") } )
A projeção a seguir retorna o campo games após os outros campos existentes incluídos na projeção, embora no documento o campo esteja listado antes dos campos joined e lastLogin:
db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )
Ou seja, a operação retorna o seguinte documento:
{ "_id" : ObjectId("5edef64a1c099fff6b033977"), "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z"), "games" : [ { "game" : "abc", "score" : 8 } ] }
Restrições
As operações
db.collection.find()nas visualizações não são compatíveis com o operador de projeção$elemMatch.Você não pode especificar um operador de consulta
$textem um$elemMatch.
Exemplos
Os exemplos no operador de projeção $elemMatch presumem uma coleção schools com os seguintes 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 }, ] }
Pesquisa de CEP
A operação retorna os seguintes documentos que têm um valor zipcode de "63109" e projeta a 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 o documento com
_idigual a1, a arraystudentscontém vários elementos com o camposchooligual a102. No entanto, a projeção$elemMatchretorna somente o primeiro elemento correspondente da array.O documento com
_idigual a3não contém o campostudentsno resultado, pois nenhum elemento em sua arraystudentscorrespondeu à condição$elemMatch.
$elemMatch com vários campos
A projeção $elemMatch pode especificar critérios em vários campos.
A operação retorna os três documentos que têm um valor zipcode de "63109":
{ "_id" : 1, "students" : [ { "name" : "jess", "school" : 102, "age" : 11 } ] } { "_id" : 3 } { "_id" : 4, "students" : [ { "name" : "ruth", "school" : 102, "age" : 16 } ] }
O documento com _id igual a 3 não contém o campo students já que nenhum elemento da array corresponde aos critérios $elemMatch.
O argumento para $elemMatch corresponde aos elementos da array que $elemMatch está projetando. Se você especificar uma igualdade com um nome de campo para $elemMatch, ele tentará corresponder a objetos dentro da array. Por exemplo, $elemMatch tenta combinar objetos, em vez de valores escalares, dentro da array para o seguinte na projeção:
Os exemplos anteriores retornam os documentos que têm um valor de zipcode "63109", mas esses documentos incluem apenas o campo _id porque a operação de projeção não encontrou elementos correspondentes.
A operação retorna os três documentos que têm o valor zipcode de "63109". Os documentos retornados incluem o campo _id e os elementos correspondentes da array athletics, se existirem.
[ { _id: 1 }, { _id: 3, athletics: [ 'basketball' ] }, { _id: 4 } ]
O documento com _id igual a 3 é o único documento que corresponde aos critérios $elemMatch .
Dica
$ (projection) operador, operador