I MongoDB er db.collection.updateMany()
metode opdaterer alle dokumenter, der matcher det angivne filter for en samling.
Eksempel
Antag, at vi har en samling kaldet pets
der indeholder følgende dokumenter:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi kan se, at to dokumenter har Dog
som deres type
.
Vi kan opdatere begge dokumenter på én gang sådan her:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Dette viser os, at to dokumenter matchede, og to blev opdateret.
Vi kan tjekke samlingen:
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Ophæv
db.collection.updateMany()
metode accepterer en upsert
argument, der sætter dig i stand til at udføre en upsert-operation.
Når upsert: true
, alle dokumenter, der matcher filterkriterierne, opdateres, men hvis der ikke er nogen match, indsættes et nyt dokument.
Lad os starte med de originale dokumenter igen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Eksempel:
db.pets.updateMany(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe27e1dd991410169410244") }
I dette tilfælde var der ingen resultater, så et dokument blev slettet.
Lad os tjekke 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" }
Indlejrede dokumenter
Du kan også bruge db.collection.updateMany()
for at opdatere indlejrede dokumenter.
Antag, at vi indsætter følgende dokumenter:
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 bruge følgende kode til at opdatere det indlejrede dokument.
db.pets.updateMany({
type: "Dog"
}, {
$set: {
"specs.color": "brown",
"specs.gooddog": false
}
})
Resultat:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Så vi kan se, at begge dokumenter blev opdateret.
Lad os tjekke 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, at de indlejrede dokumenter blev opdateret som specificeret.
Arrays
Lad os bruge db.collection.updateMany()
for at opdatere et array.
Antag, at vi har en samling kaldet players
med følgende dokumenter:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Lad os opdatere to array-elementer i alle dokumenter.
db.players.updateMany({},
{
$set: {
"scores.0": 20,
"scores.1": 26
}
})
Resultat:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Vi kan se, at alle tre dokumenter blev opdateret. Dette skyldes, at jeg efterlod filterkriterierne tomme (jeg brugte {}
for filterkriterierne).
Og lad os se 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-parameteren
Du kan også bruge arrayFilters
parameter og den positionelle $
operatør for at bestemme, hvilke array-elementer der skal opdateres.
For eksempel ved at se på vores tidligere dokument:
{ "_id" : 1, "scores" : [ 20, 26, 3 ] } { "_id" : 2, "scores" : [ 20, 26, 18 ] } { "_id" : 3, "scores" : [ 20, 26, 8 ] }
Vi kunne køre følgende forespørgsel for kun at opdatere de array-elementer, der har en værdi, der er højere end et bestemt beløb (i dette tilfælde 15).
db.players.updateMany(
{ scores: { $gte: 15 } },
{ $set: { "scores.$[e]" : 15 } },
{ arrayFilters: [ { "e": { $gte: 15 } } ] }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Som forventet matcher alle dokumenter kriterierne og er derfor opdateret. Ikke alle array-elementer blev dog opdateret.
Sådan ser dokumenterne ud nu.
db.players.find()
Resultat:
{ "_id" : 1, "scores" : [ 15, 15, 3 ] } { "_id" : 2, "scores" : [ 15, 15, 15 ] } { "_id" : 3, "scores" : [ 15, 15, 8 ] }
De eneste array-elementer, der blev opdateret, var dem med en værdi over 15.
Flere oplysninger
db.collection.updateMany()
metode accepterer også andre parametre, såsom writeConcern
, collation
og hint
.
Se MongoDB-dokumentationen for db.collections.updateMany()
for mere information.