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.