I MongoDB, når du opdaterer dokumenter, der indeholder arrays, har du mulighed for at bruge arrayFilters
parameter.
arrayFilters
parameter giver dig mulighed for at specificere et array af filterdokumenter, der bestemmer hvilke array-elementer der skal ændres.
I opdateringsdokumentet skal du bruge $[<identifier>]
filtreret positionsoperator, som identificerer de matrixelementer, der matcher arrayFilters
betingelser for opdateringen.
Syntaks
Syntaksen ser sådan ud:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Så for eksempel, når det bruges sammen med updateMany()
metode, går det sådan her:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Eksempel
Antag, at vi har en samling kaldet players
med følgende dokumenter:
{ "_id" :1, "scores" :[ 1, 5, 17 ] }{ "_id" :2, "scores" :[ 8, 17, 18 ] }{ "_id" :3, "scores " :[ 15, 11, 8 ] }
Vi kunne bruge arrayFilters
parameter for kun at opdatere de array-elementer, der har en værdi, der er højere end en vis mængde.
Eksempel:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultat:
{ "acknowledged" :true, "matchedCount" :3, "modifiedCount" :3 }
Meddelelsen fortæller os, at tre dokumenter blev matchet og ændret.
Sådan ser dokumenterne ud nu.
db.players.find()
Resultat:
{ "_id" :1, "scores" :[ 1, 5, 10 ] }{ "_id" :2, "scores" :[ 8, 10, 10 ] }{ "_id" :3, "scores " :[ 10, 10, 8 ] }
Vi kan se, at alle værdier, der tidligere var større end eller lig med 10, nu er 10.
I dette tilfælde brugte jeg e
som <identifier>
. Bemærk, at <identifier>
skal begynde med et lille bogstav og kun indeholde alfanumeriske tegn.