Wenn Sie in MongoDB Dokumente aktualisieren, die Arrays enthalten, haben Sie die Möglichkeit, die arrayFilters
zu verwenden Parameter.
Die arrayFilters
Mit dem Parameter können Sie ein Array von Filterdokumenten angeben, die bestimmen, welche Array-Elemente geändert werden sollen.
Verwenden Sie im Update-Dokument den $[<identifier>]
gefilterter Positionsoperator, der die Array-Elemente identifiziert, die mit arrayFilters
übereinstimmen Bedingungen für den Aktualisierungsvorgang.
Syntax
Die Syntax lautet wie folgt:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Also zum Beispiel bei Verwendung mit updateMany()
Methode geht das so:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Beispiel
Angenommen, wir haben eine Sammlung namens players
mit folgenden Dokumenten:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Wir könnten die arrayFilters
verwenden Parameter, um nur die Array-Elemente zu aktualisieren, deren Wert höher als ein bestimmter Betrag ist.
Beispiel:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Ergebnis:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Die Nachricht teilt uns mit, dass drei Dokumente abgeglichen und geändert wurden.
So sehen die Dokumente jetzt aus.
db.players.find()
Ergebnis:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Wir können sehen, dass alle Werte, die zuvor größer oder gleich 10 waren, jetzt 10 sind.
In diesem Fall habe ich e
verwendet als <identifier>
. Beachten Sie, dass <identifier>
muss mit einem Kleinbuchstaben beginnen und darf nur alphanumerische Zeichen enthalten.