Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

$elemMatch (query)

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Exemplos
  • Saiba mais

Dica

Veja também:

$elemMatch (projeção)

$elemMatch

O operador $elemMatch corresponde a documentos que contêm um campo de array com pelo menos um elemento que corresponda a todos os critérios de query especificados.

Você pode utilizar o $elemMatch para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }

Dados os seguintes documentos na collection scores:

{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }

A query a seguir corresponde apenas aos documentos em que a array results contém pelo menos um elemento que é maior ou igual a 80 e menor que 85:

db.scores.find(
{ results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)

A query retorna o seguinte documento porque o elemento 82 é maior ou igual a 80 e menor que 85:

{ "_id" : 1, "results" : [ 82, 85, 88 ] }

Para obter mais informações sobre a especificação de vários critérios em elementos de array, consulte Especificar várias condições para elementos de array.

Esta declaração insere documentos na collection 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 } }
] )

O documento com um _id de 5 não contém uma array. Esse documento está incluído para mostrar que $elemMatch corresponde apenas a elementos de array, que você verá nos exemplos a seguir.

A query a seguir corresponde a documento em que results contém pelo menos um elemento em que product é "xyz" e score é maior ou igual a 8:

db.survey.find(
{ results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } }
)

Especificamente, a query corresponde ao seguinte documento:

{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 },
{ "product" : "xyz", "score" : 8 } ] }

As seções a seguir mostram as diferenças de saída quando você usa $elemMatch com uma única condição de query e omite $elemMatch.

query com $elemMatch:

db.survey.find(
{ results: { $elemMatch: { product: "xyz" } } }
)

A query retorna documentos onde qualquer product em results é "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 sem $elemMatch:

db.survey.find(
{ "results.product": "xyz" }
)

Na saída a seguir, observe que o documento com um _id de 5 (que não contém uma array) também está incluído:

[
{
_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 } }
]

Considere as seguintes query:

  • A primeira query tem uma única condição <query> em $elemMatch.

  • A segunda query omite $elemMatch.

Primeira query com $elemMatch:

db.survey.find(
{ "results": { $elemMatch: { product: { $ne: "xyz" } } } }
)

A query retorna documentos que têm um product com valor diferente 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 sem $elemMatch:

db.survey.find(
{ "results.product": { $ne: "xyz" } }
)

A query retorna documentos em que nenhum dos product results é "xyz":

{ "_id" : 4, "results" : [ { "product" : "abc", "score" : 7 },
{ "product" : "def", "score" : 8 } ] }

Ambas as query incluem o documento com um _id de 4 e omitem o documento com um _id de 5 porque o product é "xyz".

Para obter exemplos adicionais da queries de arrays, consulte:

Para obter exemplos adicionais de query, consulte:

Dica

Veja também:

← $tudo
$size →