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.