sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB updateMany()

V MongoDB db.collection.updateMany() metoda aktualizuje všechny dokumenty, které odpovídají zadanému filtru pro kolekci.

Příklad

Předpokládejme, že máme sbírku nazvanou pets který obsahuje následující dokumenty:

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

Vidíme, že dva dokumenty mají Dog jako jejich type .

Oba dokumenty můžeme aktualizovat najednou takto:

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

Výsledek:

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

To nám ukazuje, že dva dokumenty se shodovaly a dva byly aktualizovány.

Můžeme zkontrolovat sbírku:

db.pets.find()

Výsledek:

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

Upsert

db.collection.updateMany() metoda přijímá upsert argument, který vám umožní provést operaci upsert.

Když upsert: true , všechny dokumenty, které odpovídají kritériím filtru, jsou aktualizovány, ale pokud žádná shoda nenastane, vloží se nový dokument.

Začněme znovu původními dokumenty:

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

Příklad:

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

Výsledek:

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

V tomto případě nebyly nalezeny žádné shody, takže dokument byl přepsán.

Podívejme se na sbírku.

db.pets.find()

Výsledek:

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

Vložené dokumenty

Můžete také použít db.collection.updateMany() k aktualizaci vložených dokumentů.

Předpokládejme, že vložíme následující dokumenty:

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

K aktualizaci vloženého dokumentu můžeme použít následující kód.

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

Výsledek:

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

Takže vidíme, že oba dokumenty byly aktualizovány.

Pojďme zkontrolovat dokument.

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

Výsledek:

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

Vidíme, že vložené dokumenty byly aktualizovány podle specifikace.

Pole

Použijme db.collection.updateMany() aktualizovat pole.

Předpokládejme, že máme kolekci nazvanou players s následujícími dokumenty:

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

Pojďme aktualizovat dva prvky pole ve všech dokumentech.

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

Výsledek:

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

Vidíme, že všechny tři dokumenty byly aktualizovány. Je to proto, že jsem nechal kritéria filtru prázdná (použil jsem {} pro kritéria filtru).

A podívejme se na dokument.

db.players.find()

Výsledek:

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

Parametr arrayFilters

Můžete také použít arrayFilters parametr a poziční $ operátor k určení, které prvky pole se mají aktualizovat.

Například při pohledu na náš předchozí dokument:

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

Mohli bychom spustit následující dotaz, abychom aktualizovali pouze ty prvky pole, které mají hodnotu vyšší než určité množství (v tomto případě 15).

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

Výsledek:

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

Podle očekávání všechny dokumenty splňují kritéria, a jsou proto aktualizovány. Ne všechny prvky pole však byly aktualizovány.

Takto nyní dokumenty vypadají.

db.players.find()

Výsledek:

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

Jediné prvky pole, které byly aktualizovány, byly ty s hodnotou vyšší než 15.

Další informace

db.collection.updateMany() metoda také přijímá další parametry, jako je writeConcern , collation a hint .

Viz dokumentaci MongoDB pro db.collections.updateMany() pro více informací.


  1. Jaká je dobrá strategie pro seskupování podobných slov?

  2. 5 způsobů, jak vložit dokumenty do MongoDB

  3. Jak povolit protokolování pro Mongoose a ovladač MongoDB Node.JS

  4. Jak vrátit jen hodnotu v MongoDB