In MongoDB de db.collection.updateOne()
methode werkt een enkel document binnen de collectie bij op basis van het filter.
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 één document als volgt 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.
Upsert
De db.collection.updateOne()
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.updateOne(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
Resultaat:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1e94dd991410169410199") }
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("5fe1e94dd991410169410199"), "name" : "Bubbles", "type" : "Fish" }
Ingesloten documenten
U kunt ook db.collection.updateOne()
. 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.updateOne({
_id: 1
}, {
$set: {
"specs.weight": 20,
"specs.color": "blue"
}
})
Resultaat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
We kunnen dus zien dat één document is bijgewerkt.
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.updateOne()
. 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.updateOne({
_id: 1
}, {
$set: {
"name": "Bark",
"awards.0": "Bottom Dog",
"awards.1": "Worst Dog"
}
})
Resultaat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
We kunnen zien dat één document is bijgewerkt.
En laten we het document eens bekijken.
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.updateOne(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultaat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Zoals verwacht, werkt dit slechts één document bij, ook al voldoen twee documenten aan de criteria.
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.updateOne()
methode accepteert ook andere parameters, zoals writeConcern
, collation
, en hint
.
Zie de MongoDB-documentatie voor db.collections.updateOne()
voor meer informatie.