sql >> Database >  >> NoSQL >> MongoDB

MongoDB findOneAndUpdate()

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.


  1. Redis Keyspace-meldingen met flushdb

  2. Subdocumentindex in Mongolië

  3. God-configuratiebestand om bestaande processen te bewaken?

  4. Importeer meer dan 1 json-bestand met mongoimport