sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB updateMany()

I MongoDB är db.collection.updateMany() metod uppdaterar alla dokument som matchar det angivna filtret för en samling.

Exempel

Anta att vi har en samling som heter pets som innehåller följande dokument:

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

Vi kan se att två dokument har Dog som deras type .

Vi kan uppdatera båda dokumenten samtidigt så här:

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

Resultat:

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

Detta visar oss att två dokument matchade och två uppdaterades.

Vi kan kontrollera samlingen:

db.pets.find()

Resultat:

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

Upsert

db.collection.updateMany() metoden accepterar en upsert argument som gör att du kan utföra en upsert-operation.

När upsert: true , alla dokument som matchar filterkriterierna uppdateras, men om det inte finns någon matchning infogas ett nytt dokument.

Låt oss börja med originaldokumenten igen:

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

Exempel:

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

Resultat:

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

I det här fallet fanns det inga matchningar, så ett dokument rubbades.

Låt oss kolla in samlingen.

db.pets.find()

Resultat:

 { "_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" } 

Inbäddade dokument

Du kan också använda db.collection.updateMany() för att uppdatera inbäddade dokument.

Anta att vi infogar följande dokument:

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"
        }
    }
])

Vi kan använda följande kod för att uppdatera det inbäddade dokumentet.

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

Resultat:

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

Så vi kan se att båda dokumenten uppdaterades.

Låt oss kontrollera dokumentet.

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

Resultat:

{
	"_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
	}
}

Vi kan se att de inbäddade dokumenten uppdaterades som specificerat.

Arrayer

Låt oss använda db.collection.updateMany() för att uppdatera en array.

Anta att vi har en samling som heter players med följande dokument:

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

Låt oss uppdatera två arrayelement i alla dokument.

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

Resultat:

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

Vi kan se att alla tre dokumenten har uppdaterats. Detta beror på att jag lämnade filterkriterierna tomma (jag använde {} för filterkriterierna).

Och låt oss titta på dokumentet.

db.players.find()

Resultat:

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

ArrayFilters-parametern

Du kan också använda arrayFilters parametern och den positionella $ operatorn för att avgöra vilka arrayelement som ska uppdateras.

Titta till exempel på vårt tidigare dokument:

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

Vi skulle kunna köra följande fråga för att bara uppdatera de arrayelement som har ett värde som är högre än ett visst belopp (i det här fallet 15).

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

Resultat:

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

Som förväntat matchar alla dokument kriterierna och uppdateras därför. Men inte alla arrayelement uppdaterades.

Så här ser dokumenten ut nu.

db.players.find()

Resultat:

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

De enda arrayelementen som uppdaterades var de med ett värde över 15.

Mer information

db.collection.updateMany() Metoden accepterar även andra parametrar, såsom writeConcern , collation och hint .

Se MongoDB-dokumentationen för db.collections.updateMany() för mer information.


  1. Säker MongoDB-distribution på Amazon AWS

  2. Finns det något sätt att flushall på ett kluster så att alla nycklar från master och slavar raderas från db

  3. Kontrollera det aktuella antalet anslutningar till MongoDb

  4. The ABCs of NestJS:En nybörjarguide med MongoDB(Mongoose).