No MongoDB, ao atualizar documentos que contêm arrays, você tem a opção de usar o
arrayFilters parâmetro. Os
arrayFilters O parâmetro permite especificar uma matriz de documentos de filtro que determinam quais elementos da matriz devem ser modificados. No documento de atualização, use o
$[<identifier>] operador posicional filtrado, que identifica os elementos da matriz que correspondem aos arrayFilters condições para a operação de atualização. Sintaxe
A sintaxe fica assim:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] } Por exemplo, quando usado com o
updateMany() método, fica assim:db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
) Exemplo
Suponha que tenhamos uma coleção chamada
players com os seguintes documentos:{ "_id" : 1, "scores" : [ 1, 5, 17 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] } Poderíamos usar os
arrayFilters parâmetro para atualizar apenas os elementos do array que possuem um valor maior que um determinado valor. Exemplo:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
) Resultado:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } A mensagem nos informa que três documentos foram combinados e modificados.
Veja como estão os documentos agora.
db.players.find() Resultado:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 10, 10, 8 ] } Podemos ver que todos os valores que antes eram maiores ou iguais a 10 agora são 10.
Neste caso, usei
e como o <identifier> . Observe que o <identifier> deve começar com uma letra minúscula e conter apenas caracteres alfanuméricos.