MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como o parâmetro arrayFilters funciona no MongoDB


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.