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

MongoDB findOneAndReplace()

I MongoDB er db.collection.findOneAndReplace() metode erstatter et enkelt dokument baseret på det angivne filter.

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.findOneAndReplace() metode til at erstatte et af disse dokumenter.

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "name": "Bruno", "type" : "Horse" }
)

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" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Vi kan se, at det første dokument er blevet erstattet med det nye dokument.

Bemærk, at erstatningsdokumentet ikke kan angive et _id værdi, der adskiller sig fra _id værdi i det erstattede dokument.

Returner det ændrede dokument

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

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.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Resultat:

{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }

Denne gang blev den anden hund opdateret. I dette tilfælde lavede vi en mere markant ændring, og vi kan se, at returdokumentet afspejler dette.

Vi kan tjekke samlingen igen for at se det erstattede dokument.

db.pets.find()

Resultat:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

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.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       returnNewDocument: true
    }
)

Resultat:

null

Dokumentet fandtes ikke i samlingen og derfor findOneAndReplace() returnerede null . Selvom vi ikke eksplicit 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, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Eksempel med upsert: true

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

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       upsert: true,
       returnNewDocument: true
    }
)

Resultat:

{
	"_id" : 4,
	"name" : "Fluffy",
	"type" : "Pooch",
	"DOB" : "2019-12-03",
	"points" : 20
}

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" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }

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

sort Parameter

Du kan bruge sort parameter for at angive en sorteringsrækkefølge for de dokumenter, der matches af filter .

Når du bruger sort parameter, en værdi på 1 sorterer dokumenterne i stigende rækkefølge og en værdi på -1 sorterer dem i faldende rækkefølge.

Argumentet skal leveres som et dokument. For eksempel { sort: { "salary": 1 } } sorterer efter salary felt i stigende rækkefølge.

Antag for eksempel, at vi opretter en samling kaldet employees med følgende dokumenter:

db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Vi kunne køre følgende kode for at finde dokumenter med en løn på mindre end 60.000, og derefter erstatte den, der er den laveste af disse dokumenter.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": 1 }
    }
)

Resultat:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Dette viser dokumentet, før det blev opdateret. Medarbejderen med den laveste løn blev som forventet skiftet ud med ny løn (og nyt navn).

Sådan ser dokumenterne ud nu.

db.employees.find()

Resultat:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Så vi kan se, at Fritz er blevet erstattet af Fluffy, som har en meget bedre løn.

Lad os vende det tilbage til det originale dokument.

db.employees.remove({})
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Lad os nu køre den samme findOneAndReplace() kode igen, men denne gang sorterer vi den i faldende rækkefølge.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": -1 }
    }
)

Resultat:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Denne gang blev Sandy erstattet.

Lad os tjekke samlingen igen.

db.employees.find()

Resultat:

{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Som forventet.

Flere oplysninger

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

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


  1. Sådan forespørges en underdokumentsamling ved hjælp af MongoDB og C# driver

  2. Sådan bruger du ny URL fra mongodb 3.6 til at oprette forbindelse fra golang

  3. Hvordan sender socket.io beskeder på tværs af flere servere?

  4. Mongoose Schema er ikke blevet registreret for model