In MongoDB de db.collection.findOneAndUpdate()
methode werkt een enkel document bij op basis van het filter
en sort
criteria.
De collection
deel is de naam van de verzameling waarmee de bewerking moet worden uitgevoerd.
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 de db.collection.findOneAndUpdate()
. gebruiken methode om een van die documenten bij te werken.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Cow" } }
)
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Standaard wordt het originele document geretourneerd (niet de gewijzigde versie).
Merk op dat slechts één hond is bijgewerkt, ook al zijn er twee honden in de collectie.
Laten we de collectie eens bekijken.
db.pets.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
We kunnen zien dat het eerste document nu een koe bevat in plaats van een hond.
Retourneer het gewijzigde document
Standaard wordt het originele document geretourneerd wanneer u db.collection.findOneAndUpdate()
gebruikt .
Als u liever wilt dat het gewijzigde document wordt geretourneerd, gebruikt u de returnNewDocument
parameter.
Laten we nog een wijziging aanbrengen, maar deze keer gebruiken we returnNewDocument: true
.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Horse" } },
{ returnNewDocument: true }
)
Resultaat:
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
Deze keer werd de andere hond geüpdatet. In dit geval hebben we het veranderd in een paard en we kunnen zien dat het retourdocument dit weerspiegelt.
Upserts
Een upsert is een optie die u kunt gebruiken bij updatebewerkingen. Als het opgegeven document niet bestaat, wordt een nieuw ingevoegd. Als het doet bestaat, wordt het originele document bijgewerkt (en wordt er geen document ingevoegd).
U kunt upserts uitvoeren door upsert: true
op te geven .
Voorbeeld met upsert: false
Ten eerste, hier is een voorbeeld van het proberen om een niet-bestaand document bij te werken wanneer upsert: false
.
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
returnNewDocument: true
}
)
Resultaat:
null
Het document bestond niet in de collectie en dus findOneAndUpdate()
null
geretourneerd . Ook al hebben we upsert: false
niet gespecificeerd , we weten dat het onwaar was, want dat is de standaardwaarde (d.w.z. dat is de waarde die wordt gebruikt wanneer u geen upsert-optie opgeeft).
Als we nog een keer in de collectie kijken, kunnen we zien dat het document niet is geüpdatet.
db.pets.find()
Resultaat:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" }
Voorbeeld met upsert: true
Hier is het weer, maar deze keer specificeren we upsert: true
.
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
upsert: true,
returnNewDocument: true
}
)
Resultaat:
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }
Deze keer wordt een nieuw document upserted en zien we het upserted document als de uitvoer (omdat we returnNewDocument: true
hebben gespecificeerd ).
Laten we de collectie nog eens bekijken.
db.pets.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Barry", "type" : "Badger" }
We kunnen dus zien dat het nieuwe document inderdaad is geüpdatet.
De arrayFilters
Parameter
Als u met arrays werkt, kunt u de arrayFilters
. gebruiken parameter samen met de positionele $
operator om te bepalen welke array-elementen moeten worden bijgewerkt. Dit stelt je in staat om een array-element bij te werken op basis van zijn waarde, zelfs als je de positie niet weet.
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.findOneAndUpdate(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{
arrayFilters: [ { "e": { $gte: 10 } } ]
}
)
Resultaat:
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
Dit toont het document voordat het werd bijgewerkt. Zoals verwacht wordt hiermee slechts één document bijgewerkt, 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.findOneAndUpdate()
methode accepteert ook andere parameters, zoals projection
(om een subset van te retourneren velden te specificeren), sort
, maxTimeMS
, en collation
.
Zie de MongoDB-documentatie voor db.collections.findOneAndUpdate()
voor meer informatie.