MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Funktionsweise des arrayFilters-Parameters in MongoDB

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.