В 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>
трябва да започва с малка буква и да съдържа само буквено-цифрови знаци.