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.