V MongoDB, když aktualizujete dokumenty, které obsahují pole, máte možnost použít arrayFilters
parametr.
arrayFilters
Parametr umožňuje zadat pole dokumentů filtru, které určují, které prvky pole se mají upravit.
V dokumentu aktualizace použijte $[<identifier>]
filtrovaný poziční operátor, který identifikuje prvky pole, které odpovídají arrayFilters
podmínky pro operaci aktualizace.
Syntaxe
Syntaxe vypadá takto:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Například při použití s updateMany()
metoda, vypadá to takto:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Příklad
Předpokládejme, že máme kolekci nazvanou players
s následujícími dokumenty:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Mohli bychom použít arrayFilters
pro aktualizaci pouze těch prvků pole, které mají hodnotu vyšší než určité množství.
Příklad:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Výsledek:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Zpráva nám říká, že byly spárovány a upraveny tři dokumenty.
Takto nyní dokumenty vypadají.
db.players.find()
Výsledek:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Vidíme, že všechny hodnoty, které byly dříve větší nebo rovné 10, jsou nyní 10.
V tomto případě jsem použil e
jako <identifier>
. Všimněte si, že <identifier>
musí začínat malým písmenem a obsahovat pouze alfanumerické znaky.