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.