sql >> Database >  >> NoSQL >> MongoDB

MongoDB updateMany()

In MongoDB de db.collection.updateMany() methode werkt alle documenten bij die overeenkomen met het opgegeven filter voor een verzameling.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets die de volgende documenten bevat:

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

We kunnen zien dat twee documenten Dog . hebben als hun type .

We kunnen beide documenten tegelijk als volgt bijwerken:

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

Resultaat:

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

Dit laat ons zien dat twee documenten overeenkwamen en twee werden bijgewerkt.

We kunnen de collectie controleren:

db.pets.find()

Resultaat:

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

Upsert

De db.collection.updateMany() methode accepteert een upsert argument waarmee u een upsert-bewerking kunt uitvoeren.

Wanneer upsert: true , worden alle documenten die voldoen aan de filtercriteria bijgewerkt, maar als er geen overeenkomst is, wordt een nieuw document ingevoegd.

Laten we opnieuw beginnen met de originele documenten:

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

Voorbeeld:

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

Resultaat:

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

In dit geval waren er geen overeenkomsten, dus een document werd geüpdatet.

Laten we de collectie eens bekijken.

db.pets.find()

Resultaat:

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

Ingesloten documenten

U kunt ook db.collection.updateMany() . gebruiken om ingesloten documenten bij te werken.

Stel dat we de volgende documenten invoegen:

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

We kunnen de volgende code gebruiken om het ingesloten document bij te werken.

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

Resultaat:

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

We kunnen dus zien dat beide documenten zijn bijgewerkt.

Laten we het document controleren.

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

Resultaat:

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

We kunnen zien dat de ingesloten documenten zijn bijgewerkt zoals gespecificeerd.

Arrays

Laten we db.collection.updateMany() . gebruiken om een ​​array bij te werken.

Stel dat we een verzameling hebben met de naam players met de volgende documenten:

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

Laten we twee array-elementen in alle documenten bijwerken.

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

Resultaat:

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

We kunnen zien dat alle drie de documenten zijn bijgewerkt. Dit komt omdat ik de filtercriteria leeg heb gelaten (ik gebruikte {} voor de filtercriteria).

En laten we het document eens bekijken.

db.players.find()

Resultaat:

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

De arrayFilters-parameter

U kunt ook de arrayFilters . gebruiken parameter en de positionele $ operator om te bepalen welke array-elementen moeten worden bijgewerkt.

Kijk bijvoorbeeld naar ons vorige document:

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

We zouden de volgende query kunnen uitvoeren om alleen die array-elementen bij te werken die een waarde hebben die hoger is dan een bepaald aantal (in dit geval 15).

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

Resultaat:

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

Zoals verwacht voldoen alle documenten aan de criteria en worden ze daarom bijgewerkt. Niet alle array-elementen zijn echter bijgewerkt.

Zo zien de documenten er nu uit.

db.players.find()

Resultaat:

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

De enige array-elementen die zijn bijgewerkt, waren die met een waarde hoger dan 15.

Meer informatie

De db.collection.updateMany() methode accepteert ook andere parameters, zoals writeConcern , collation , en hint .

Zie de MongoDB-documentatie voor db.collections.updateMany() voor meer informatie.


  1. Hoe banen te vernietigen die in de wachtrij zijn geplaatst door reddingswerkers?

  2. Werk een waarde in MongoDB bij op basis van de huidige waarde

  3. Hoe kan ik Python gebruiken om MongoDB's bsondump om te zetten in JSON?

  4. Rescue:Verbinding geweigerd - Kan geen verbinding maken met Redis op localhost:6379