In MongoDB de db.collection.update()
methode wijzigt een bestaand document of documenten in een verzameling.
Standaard wordt er slechts één document bijgewerkt. Maar als multi: true
is opgegeven, werkt het alle documenten bij die voldoen aan de zoekcriteria.
Een enkel document bijwerken
Stel dat we de collectie hebben met de naam pets
met de volgende documenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
We kunnen een enkel document als volgt bijwerken:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultaat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Er is slechts één document bijgewerkt. Dit wordt bevestigd wanneer we de collectie opvragen.
db.pets.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Meerdere documenten bijwerken
Laten we de originele documenten opnieuw gebruiken:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Deze keer voegen we multi: true
. toe aan onze update-operatie om alle documenten bij te werken die voldoen aan de zoekcriteria:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Resultaat:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Dus twee documenten zijn deze keer gematcht en bijgewerkt.
Laten we onze collectie nog eens bekijken:
db.pets.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Zoals verwacht hebben beide documenten nu een type
van Cow
.
Upsert
De db.collection.update()
methode accepteert een upsert
argument waarmee u een upsert-bewerking kunt uitvoeren.
Wanneer upsert: true
, het document wordt bijgewerkt als er een overeenkomst is met de filtercriteria, 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.update(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
Resultaat:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5fe2c925d9914101694102e1") })
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("5fe2c925d9914101694102e1"), "name" : "Bubbles", "type" : "Fish" }
Ingesloten documenten
U kunt ook db.collection.update()
. gebruiken om ingesloten documenten bij te werken.
Stel dat we het volgende document hebben:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
We kunnen de volgende code gebruiken om het ingesloten document bij te werken.
db.pets.update({
_id: 1
}, {
$set: {
"specs.weight": 20,
"specs.color": "blue"
}
})
Resultaat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
We kunnen dus zien dat één document is gematcht en gewijzigd.
Laten we het document controleren.
db.pets.find({
_id: 1
}).pretty()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 20, "color" : "blue" } }
We kunnen zien dat het ingesloten document is bijgewerkt zoals gespecificeerd.
Arrays
Laten we db.collection.update()
. gebruiken om een array bij te werken.
Stel dat we het volgende document hebben:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Laten we twee van de array-elementen en de naam van de hond bijwerken.
db.pets.update({
_id: 1
}, {
$set: {
"name": "Bark",
"awards.0": "Bottom Dog",
"awards.1": "Worst Dog"
}
})
Resultaat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
We kunnen zien dat één document is gematcht en gewijzigd.
En kijk nu naar het document.
db.pets.find().pretty()
Resultaat:
{ "_id" : 1, "name" : "Bark", "type" : "Dog", "awards" : [ "Bottom Dog", "Worst Dog", "Biggest Dog" ] }
De arrayFilters-parameter
U kunt ook de arrayFilters
. gebruiken parameter en de positionele $
operator om te bepalen welke array-elementen moeten worden bijgewerkt.
Stel dat we bijvoorbeeld 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 ] }
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 10).
db.players.update(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultaat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Zoals verwacht, werkt dit slechts één document bij, ook al voldoen twee documenten aan de criteria (omdat we multi: true
niet hebben gespecificeerd ).
Zo zien de documenten er nu uit.
db.players.find()
Resultaat:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Document 2 had twee array-elementen bijgewerkt, omdat die elementen aan de criteria voldeden.
Meer informatie
De db.collection.update()
methode accepteert ook andere parameters, zoals writeConcern
, collation
, en hint
.
Zie de MongoDB-documentatie voor db.collections.update()
voor meer informatie.