MongoDB biedt verschillende manieren om een document bij te werken. De methode die u gebruikt, hangt af van hoe u de update precies wilt uitvoeren.
Dit artikel presenteert 4 manieren om een document in MongoDB bij te werken.
De db.collection.updateOne()
Methode
De db.collection.updateOne()
methode doet precies wat de naam belooft - het werkt één document bij.
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 zouden één document als volgt kunnen bijwerken:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultaat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Dat heeft slechts één document bijgewerkt, ook al voldoen twee documenten aan de filtercriteria (de criteria zijn type: "Dog"
).
We kunnen de resultaten als volgt controleren:
db.pets.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Het eerste document heeft nu een type
van Cow
in plaats van Dog
, maar het tweede document werd niet beïnvloed, ook al voldeed het ook aan de filtercriteria.
De db.collection.updateMany()
Methode
De db.collection.updateMany()
methode werkt alle documenten bij die overeenkomen met het opgegeven filter voor een verzameling.
Laten we de originele incassodocumenten gebruiken:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Nogmaals, 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" }
De db.collection.update()
Methode
De db.collection.update()
methode kan een enkel document of meerdere documenten in een verzameling bijwerken.
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
Laten we de originele verzameling documenten opnieuw gebruiken:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
We zouden één document als volgt kunnen bijwerken:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultaat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Slechts één document is 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 weer teruggaan naar de oorspronkelijke verzameling documenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
En nu 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
.
De db.collection.replaceOne()
Methode
De db.collection.replaceOne()
methode vervangt een enkel document binnen de collectie op basis van het filter.
Opnieuw de originele collectie gebruikend:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Laten we eens kijken wat er gebeurt als we de db.collection.replaceOne()
. gebruiken methode ertegen.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Resultaat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Eén document is bijgewerkt.
Laten we eens kijken.
db.pets.find()
Resultaat:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Deze keer werd het hele document vervangen door het nieuwe document (behalve de _id
veld).
Deze methode vervangt het hele document (behalve de _id
veld).
Upsert
Alle bovenstaande methoden accepteren een upsert
argument waarmee u een upsert-bewerking kunt uitvoeren.
Wanneer upsert: true
, wordt het document bijgewerkt als er een overeenkomst is met de zoekcriteria, maar als er geen overeenkomst is, wordt een nieuw document ingevoegd.
Voorbeeld:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Resultaat:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
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, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }