В MongoDB, когато актуализирате документи, които съдържат масиви, имате възможност да използвате arrayFilters параметър.
arrayFilters параметърът ви позволява да зададете масив от филтриращи документи, които определят кои елементи на масива да модифицирате.
В документа за актуализиране използвайте $[<identifier>] филтриран позиционен оператор, който идентифицира елементите на масива, които съответстват на arrayFilters условия за операцията по актуализиране.
Синтаксис
Синтаксисът е така:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Така например, когато се използва с updateMany() метод, става така:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
) Пример
Да предположим, че имаме колекция, наречена players със следните документи:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }
Можем да използваме arrayFilters параметър за актуализиране само на онези елементи от масива, които имат стойност, по-висока от определено количество.
Пример:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
) Резултат:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } Съобщението ни казва, че три документа са съпоставени и променени.
Ето как изглеждат документите сега.
db.players.find() Резултат:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 10, 10, 8 ] } Можем да видим, че всички стойности, които преди са били по-големи или равни на 10, сега са 10.
В този случай използвах e като <identifier> . Имайте предвид, че <identifier> трябва да започва с малка буква и да съдържа само буквено-цифрови знаци.