sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB findOneAndUpdate()

I MongoDB er db.collection.findOneAndUpdate() metoden opdaterer et enkelt dokument baseret på filter og sort kriterier.

collection del er navnet på den samling, som operationen skal udføres med.

Eksempel

Antag, at vi har en samling kaldet pets der indeholder følgende dokumenter:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Vi kan bruge db.collection.findOneAndUpdate() metode til at opdatere et af disse dokumenter.

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Cow" } }
)

Resultat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" } 

Som standard returnerer den det originale dokument (ikke den ændrede version).

Bemærk, at kun én hund blev opdateret, selvom der er to hunde i samlingen.

Lad os tjekke samlingen.

db.pets.find()

Resultat:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Vi kan se, at det første dokument nu indeholder en ko i stedet for en hund.

Returner det ændrede dokument

Som standard returneres det originale dokument, når du bruger db.collection.findOneAndUpdate() .

Hvis du foretrækker at få det ændrede dokument returneret i stedet, skal du bruge returnNewDocument parameter.

Lad os lave endnu en ændring, men denne gang bruger vi returnNewDocument: true .

db.pets.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Resultat:

{ "_id" : 2, "name" : "Bark", "type" : "Horse" }

Denne gang blev den anden hund opdateret. I dette tilfælde ændrede vi det til en hest, og vi kan se, at returdokumentet afspejler dette.

Upserts

En upsert er en mulighed, som du kan bruge til opdateringshandlinger. Hvis det angivne dokument ikke eksisterer, indsættes et nyt. Hvis det gør eksisterer, så opdateres det originale dokument (og intet dokument er indsat).

Du kan udføre upserts ved at angive upsert: true .

Eksempel med upsert: false

Først, her er et eksempel på forsøg på at opdatere et ikke-eksisterende dokument, når upsert: false .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Resultat:

null

Dokumentet eksisterede ikke i samlingen og derfor findOneAndUpdate() returnerede null . Selvom vi ikke specificerede upsert: false , vi ved, at det var falsk, fordi det er standardværdien (dvs. det er den værdi, der bruges, når du ikke angiver en upsert-indstilling).

Hvis vi kigger igen i samlingen, kan vi se, at dokumentet ikke blev slettet.

db.pets.find()

Resultat:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Eksempel med upsert: true

Nu er den her igen, men denne gang angiver vi upsert: true .

db.pets.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        upsert: true,
        returnNewDocument: true 
    }
)

Resultat:

{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Denne gang er et nyt dokument opsat, og vi ser det opsatte dokument som output (fordi vi har specificeret returnNewDocument: true ).

Lad os tjekke samlingen igen.

db.pets.find()

Resultat:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

Så vi kan se, at det nye dokument faktisk blev ophævet.

arrayFilters Parameter

Når du arbejder med arrays, kan du bruge arrayFilters parameter sammen med den positionelle $ operatør for at bestemme, hvilke array-elementer der skal opdateres. Dette giver dig mulighed for at opdatere et array-element baseret på dets værdi, selvom du ikke kender dets position.

Antag for eksempel, at vi har en samling kaldet players med følgende dokumenter:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Vi kunne køre følgende forespørgsel for kun at opdatere de array-elementer, der har en værdi højere end et bestemt beløb (i dette tilfælde 10).

db.players.findOneAndUpdate(
   { scores: { $gte: 10 } },
   { $set: { "scores.$[e]" : 10 } },
   {
       arrayFilters: [ { "e": { $gte: 10 } } ]
    }
)

Resultat:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Dette viser dokumentet, før det blev opdateret. Som forventet opdaterer dette kun ét dokument, selvom to dokumenter matcher kriterierne.

Sådan ser dokumenterne ud nu.

db.players.find()

Resultat:

{ "_id" : 1, "scores" : [ 1, 5, 3 ] }
{ "_id" : 2, "scores" : [ 8, 10, 10 ] }
{ "_id" : 3, "scores" : [ 15, 11, 8 ] }

Dokument 2 havde to array-elementer opdateret, fordi disse elementer matchede kriterierne.

Flere oplysninger

db.collection.findOneAndUpdate() metode accepterer også andre parametre, såsom projection (for at angive et undersæt af felter, der skal returneres), sort , maxTimeMS , og collation .

Se MongoDB-dokumentationen for db.collections.findOneAndUpdate() for mere information.


  1. Redis:fan ud nyhedsfeeds i liste eller sorteret sæt?

  2. MongoDB deleteMany()

  3. Opdater dokumenter i MongoDB

  4. MongoDB Node check om objectid er gyldigt