sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB findOneAndReplace()

I MongoDB är db.collection.findOneAndReplace() metod ersätter ett enda dokument baserat på det angivna filtret.

collection del är namnet på samlingen med vilken operationen ska utföras.

Exempel

Anta att vi har en samling som heter pets som innehåller följande dokument:

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

Vi kan använda db.collection.findOneAndReplace() metod för att ersätta ett av dessa dokument.

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

Resultat:

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

Som standard returnerar den originaldokumentet (inte den modifierade versionen).

Observera att endast en hund uppdaterades, även om det finns två hundar i samlingen.

Låt oss kolla in 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 att det första dokumentet har ersatts med det nya dokumentet.

Observera att ersättningsdokumentet inte kan ange ett _id värde som skiljer sig från _id värdet i det ersatta dokumentet.

Returnera det ändrade dokumentet

Som standard returneras originaldokumentet när du använder db.collection.findOneAndReplace() .

Om du föredrar att få det ändrade dokumentet returnerat istället, använd returnNewDocument parameter.

Låt oss göra en annan ändring, men den här gången använder 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 }

Den här gången uppdaterades den andra hunden. I det här fallet gjorde vi en mer betydande förändring och vi kan se att returdokumentet återspeglar detta.

Vi kan kontrollera samlingen igen för att se det ersatta dokumentet.

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" }

Uppserts

En upsert är ett alternativ som du kan använda vid uppdateringsoperationer. Om det angivna dokumentet inte finns infogas ett nytt. Om den gör det existerar, då uppdateras originaldokumentet (och inget dokument infogas).

Du kan utföra upserts genom att ange upsert: true .

Exempel med upsert: false

Först, här är ett exempel på att försöka uppdatera ett icke-existerande 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 fanns inte i samlingen och därför findOneAndReplace() returnerade null . Även om vi inte uttryckligen angav upsert: false , vi vet att det var falskt eftersom det är standardvärdet (dvs det är det värde som används när du inte anger ett upphävandealternativ).

Om vi ​​tittar igen i samlingen kan vi se att dokumentet inte har rubbats.

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" }

Exempel med upsert: true

Nu är den här igen, men den här gången anger 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
}

Den här gången läggs ett nytt dokument upp och vi ser det upphävda dokumentet som utdata (eftersom vi angav returnNewDocument: true ).

Låt oss kolla in 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 att det nya dokumentet faktiskt var upphävt.

sort Parameter

Du kan använda sort parameter för att ange en sorteringsordning för dokumenten som matchas av filter .

När du använder sort parameter, ett värde på 1 sorterar dokumenten i stigande ordning och värdet -1 sorterar dem i fallande ordning.

Argumentet måste tillhandahållas som ett dokument. Till exempel, { sort: { "salary": 1 } } sorterar efter salary fältet i stigande ordning.

Anta till exempel att vi skapar en samling som heter employees med följande dokument:

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 kan köra följande kod för att hitta dokument med en lön på mindre än 60 000, och sedan ersätta den som är lägst av dessa dokument.

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

Resultat:

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

Detta visar dokumentet innan det uppdaterades. Som väntat ersattes den anställde med lägst lön med en ny lön (och ett nytt namn).

Så här ser dokumenten ut 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 att Fritz har ersatts av Fluffy som har en mycket bättre lön.

Låt oss återställa det till originaldokumentet.

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 }
    ])

Låt oss nu köra samma findOneAndReplace() kod igen, men den här gången sorterar vi den i fallande ordning.

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

Resultat:

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

Den här gången byttes Sandy ut.

Låt oss kolla in 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 förväntat.

Mer information

db.collection.findOneAndReplace() Metoden accepterar även andra parametrar, såsom projection (för att ange en delmängd av fält att returnera), maxTimeMS och collation .

Se MongoDB-dokumentationen för db.collections.findOneAndReplace() för mer information.


  1. Arkitektoniska mönster för nära realtidsdatabehandling med Apache Hadoop

  2. En publikation döljer kapslade fält från en annan publikation

  3. Geospatial $nära inom aktuellt dokumentfältvärde

  4. Hur förbättrar jag Redis-serverns CPU-användning?