W MongoDB, kiedy aktualizujesz dokumenty zawierające tablice, możesz użyć arrayFilters parametr.
arrayFilters parametr pozwala określić tablicę dokumentów filtrów, które określają, które elementy tablicy należy zmodyfikować.
W dokumencie aktualizacji użyj $[<identifier>] filtrowany operator pozycyjny, który identyfikuje elementy tablicy pasujące do arrayFilters warunki operacji aktualizacji.
Składnia
Składnia wygląda tak:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Na przykład, gdy jest używany z updateMany() metoda, wygląda to tak:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
) Przykład
Załóżmy, że mamy kolekcję o nazwie players z następującymi dokumentami:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }
Moglibyśmy użyć arrayFilters parametr, aby zaktualizować tylko te elementy tablicy, które mają wartość wyższą niż określona ilość.
Przykład:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
) Wynik:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } Wiadomość informuje nas, że trzy dokumenty zostały dopasowane i zmodyfikowane.
Oto, jak teraz wyglądają dokumenty.
db.players.find() Wynik:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 10, 10, 8 ] } Widzimy, że wszystkie wartości, które wcześniej były większe lub równe 10, to teraz 10.
W tym przypadku użyłem e jako <identifier> . Zauważ, że <identifier> musi zaczynać się od małej litery i zawierać tylko znaki alfanumeryczne.