sql >> Database >  >> NoSQL >> MongoDB

MongoDB findOneAndReplace()

In MongoDB de db.collection.findOneAndReplace() methode vervangt een enkel document op basis van het gespecificeerde filter.

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.findOneAndReplace() . gebruiken methode om een ​​van die documenten te vervangen.

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

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

We kunnen zien dat het eerste document is vervangen door het nieuwe document.

Merk op dat het vervangende document geen _id . kan specificeren waarde die verschilt van de _id waarde in het vervangen document.

Retourneer het gewijzigde document

Standaard wordt het originele document geretourneerd wanneer u db.collection.findOneAndReplace() 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.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Resultaat:

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

Deze keer werd de andere hond geüpdatet. In dit geval hebben we een belangrijkere wijziging aangebracht en we kunnen zien dat het retourdocument dit weerspiegelt.

We kunnen de verzameling opnieuw controleren om het vervangen document te zien.

db.pets.find()

Resultaat:

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

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

Resultaat:

null

Het document bestond niet in de verzameling en dus findOneAndReplace() null geretourneerd . Ook al hebben we upsert: false niet expliciet 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, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Voorbeeld met upsert: true

Hier is het weer, maar deze keer specificeren we upsert: true .

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

Resultaat:

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

Deze keer wordt een nieuw document upserted en we zien 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" : "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 }

We kunnen dus zien dat het nieuwe document inderdaad is geüpdatet.

De sort Parameter

U kunt de sort . gebruiken parameter om een ​​sorteervolgorde op te geven voor de documenten die overeenkomen met het filter .

Bij gebruik van de sort parameter, een waarde van 1 sorteert de documenten in oplopende volgorde, en een waarde van -1 sorteert ze in aflopende volgorde.

Het argument moet als document worden aangeleverd. Bijvoorbeeld { sort: { "salary": 1 } } sorteert op salary veld in oplopende volgorde.

Stel dat we bijvoorbeeld een verzameling maken met de naam employees met de volgende documenten:

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

We kunnen de volgende code uitvoeren om documenten te vinden met een salaris van minder dan 60000, en dan de code met de laagste van die documenten te vervangen.

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

Resultaat:

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

Dit toont het document voordat het werd bijgewerkt. Zoals verwacht is de medewerker met het laagste salaris vervangen door een nieuw salaris (en een nieuwe naam).

Zo zien de documenten er nu uit.

db.employees.find()

Resultaat:

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

We kunnen dus zien dat Fritz is vervangen door Fluffy die een veel beter salaris heeft.

Laten we het terugzetten naar het originele document.

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

Laten we nu dezelfde findOneAndReplace() . uitvoeren code opnieuw, maar deze keer sorteren we het in aflopende volgorde.

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

Resultaat:

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

Deze keer werd Sandy vervangen.

Laten we de collectie nog eens bekijken.

db.employees.find()

Resultaat:

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

Zoals verwacht.

Meer informatie

De db.collection.findOneAndReplace() methode accepteert ook andere parameters, zoals projection (om een ​​subset van te retourneren velden te specificeren), maxTimeMS , en collation .

Zie de MongoDB-documentatie voor db.collections.findOneAndReplace() voor meer informatie.


  1. Kon geen verbinding maken met Redis om 127.0.0.1:6379:Verbinding geweigerd

  2. MongoDB Aggregation Framework - Dynamic Field Rename

  3. MongoDB $filter

  4. Een element verwijderen uit een dubbel geneste array in een MongoDB-document.