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.