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

MongoDB updateMany()

In MongoDB die db.collection.updateMany() -Methode aktualisiert alle Dokumente, die dem angegebenen Filter für eine Sammlung entsprechen.

Beispiel

Angenommen, wir haben eine Sammlung namens pets die folgende Dokumente enthält:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Wir können sehen, dass zwei Dokumente Dog haben als ihren type .

Wir können beide Dokumente gleichzeitig wie folgt aktualisieren:

db.pets.updateMany( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Ergebnis:

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

Dies zeigt uns, dass zwei Dokumente übereinstimmen und zwei aktualisiert wurden.

Wir können die Sammlung überprüfen:

db.pets.find()

Ergebnis:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Nach oben einfügen

Die db.collection.updateMany() -Methode akzeptiert einen upsert Argument, mit dem Sie eine Upsert-Operation ausführen können.

Wenn upsert: true , werden alle Dokumente, die den Filterkriterien entsprechen, aktualisiert, aber wenn es keine Übereinstimmung gibt, wird ein neues Dokument eingefügt.

Beginnen wir wieder mit den Originaldokumenten:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Beispiel:

db.pets.updateMany( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Ergebnis:

 {
 "acknowledged" : true,
 "matchedCount" : 0,
 "modifiedCount" : 0,
 "upsertedId" : ObjectId("5fe27e1dd991410169410244")
 } 

In diesem Fall gab es keine Übereinstimmungen, also wurde ein Dokument eingefügt.

Sehen wir uns die Sammlung an.

db.pets.find()

Ergebnis:

 { "_id" : 1, "name" : "Wag", "type" : "Dog" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe27e1dd991410169410244"), "name" : "Bubbles", "type" : "Fish" } 

Eingebettete Dokumente

Sie können auch db.collection.updateMany() verwenden um eingebettete Dokumente zu aktualisieren.

Angenommen, wir fügen die folgenden Dokumente ein:

db.pets.insertMany([
    {
        "_id" : 1,
        "name" : "Wag",
        "type" : "Dog",
        "specs" : {
            "height" : 400,
            "weight" : 15,
            "color" : "white"
        }
    },  
    {
        "_id" : 2,
        "name" : "Bark",
        "type" : "Dog",
        "specs" : {
            "height" : 200,
            "weight" : 12,
            "color" : "white"
        }
    }
])

Wir können den folgenden Code verwenden, um das eingebettete Dokument zu aktualisieren.

db.pets.updateMany({ 
    type: "Dog" 
    }, { 
        $set: { 
            "specs.color": "brown",
            "specs.gooddog": false
        } 
})

Ergebnis:

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } 

Wir können also sehen, dass beide Dokumente aktualisiert wurden.

Sehen wir uns das Dokument an.

db.pets.find({
    type: "Dog"
    }).pretty()

Ergebnis:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown",
		"gooddog" : false
	}
}
{
	"_id" : 2,
	"name" : "Bark",
	"type" : "Dog",
	"specs" : {
		"height" : 200,
		"weight" : 12,
		"color" : "brown",
		"gooddog" : false
	}
}

Wir können sehen, dass die eingebetteten Dokumente wie angegeben aktualisiert wurden.

Arrays

Lassen Sie uns db.collection.updateMany() verwenden um ein Array zu aktualisieren.

Angenommen, wir haben eine Sammlung namens players mit folgenden Dokumenten:

 { "_id" : 1, "scores" : [ 1, 5, 3 ] }
 { "_id" : 2, "scores" : [ 8, 17, 18 ] }
 { "_id" : 3, "scores" : [ 15, 11, 8 ] } 

Lassen Sie uns zwei Array-Elemente in allen Dokumenten aktualisieren.

db.players.updateMany({}, 
{ 
        $set: {
            "scores.0": 20, 
            "scores.1": 26
        } 
})

Ergebnis:

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Wir können sehen, dass alle drei Dokumente aktualisiert wurden. Das liegt daran, dass ich die Filterkriterien leer gelassen habe (ich habe {} verwendet für die Filterkriterien).

Sehen wir uns das Dokument an.

db.players.find()

Ergebnis:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

Der arrayFilters-Parameter

Sie können auch die arrayFilters verwenden -Parameter und den positionellen $ Operator, um zu bestimmen, welche Array-Elemente aktualisiert werden sollen.

Schauen Sie sich zum Beispiel unser vorheriges Dokument an:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

Wir könnten die folgende Abfrage ausführen, um nur die Array-Elemente zu aktualisieren, deren Wert höher als ein bestimmter Betrag ist (in diesem Fall 15).

db.players.updateMany(
   { scores: { $gte: 15 } },
   { $set: { "scores.$[e]" : 15 } },
   { arrayFilters: [ { "e": { $gte: 15 } } ] }
)

Ergebnis:

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } 

Wie erwartet entsprechen alle Dokumente den Kriterien und werden daher aktualisiert. Es wurden jedoch nicht alle Array-Elemente aktualisiert.

So sehen die Dokumente jetzt aus.

db.players.find()

Ergebnis:

{ "_id" : 1, "scores" : [ 15, 15, 3 ] }
{ "_id" : 2, "scores" : [ 15, 15, 15 ] }
{ "_id" : 3, "scores" : [ 15, 15, 8 ] }

Die einzigen Array-Elemente, die aktualisiert wurden, waren diejenigen mit einem Wert über 15.

Weitere Informationen

Die db.collection.updateMany() -Methode akzeptiert auch andere Parameter wie writeConcern , collation , und hint .

Siehe die MongoDB-Dokumentation für db.collections.updateMany() für weitere Informationen.