In MongoDB, quando aggiorni documenti che contengono array, hai la possibilità di usare gli arrayFilters
parametro.
Gli arrayFilters
consente di specificare un array di documenti filtro che determinano quali elementi dell'array modificare.
Nel documento di aggiornamento, usa il $[<identifier>]
operatore posizionale filtrato, che identifica gli elementi dell'array che corrispondono a arrayFilters
condizioni per l'operazione di aggiornamento.
Sintassi
La sintassi è questa:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Ad esempio, se utilizzato con updateMany()
metodo, funziona così:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Esempio
Supponiamo di avere una collezione chiamata players
con i seguenti documenti:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Potremmo usare gli arrayFilters
parametro per aggiornare solo gli elementi dell'array che hanno un valore superiore a un determinato importo.
Esempio:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Risultato:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Il messaggio ci dice che tre documenti sono stati abbinati e modificati.
Ecco come sono ora i documenti.
db.players.find()
Risultato:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Possiamo vedere che tutti i valori che prima erano maggiori o uguali a 10 ora sono 10.
In questo caso, ho usato e
come <identifier>
. Si noti che il <identifier>
deve iniziare con una lettera minuscola e contenere solo caratteri alfanumerici.