sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB findOneAndReplace()

V MongoDB db.collection.findOneAndReplace() metoda nahradí jeden dokument na základě zadaného filtru.

collection část je název kolekce, se kterou se má operace provést.

Příklad

Předpokládejme, že máme sbírku nazvanou pets který obsahuje následující dokumenty:

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

Můžeme použít db.collection.findOneAndReplace() způsob nahrazení jednoho z těchto dokumentů.

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

Výsledek:

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

Ve výchozím nastavení vrací původní dokument (nikoli upravenou verzi).

Všimněte si, že byl aktualizován pouze jeden pes, i když ve sbírce jsou dva psi.

Podívejme se na sbírku.

db.pets.find()

Výsledek:

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

Vidíme, že první dokument byl nahrazen novým dokumentem.

Všimněte si, že náhradní dokument nemůže specifikovat _id hodnota, která se liší od _id hodnotu v nahrazeném dokumentu.

Vraťte upravený dokument

Ve výchozím nastavení se při použití db.collection.findOneAndReplace() vrátí původní dokument .

Pokud chcete, aby se místo toho vrátil upravený dokument, použijte returnNewDocument parametr.

Udělejme další úpravu, ale tentokrát použijeme returnNewDocument: true .

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Výsledek:

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

Tentokrát byl aktualizován druhý pes. V tomto případě jsme provedli významnější změnu a vidíme, že návratový dokument to odráží.

Můžeme znovu zkontrolovat sbírku, abychom viděli nahrazený dokument.

db.pets.find()

Výsledek:

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

Upserts

Upsert je možnost, kterou můžete použít při operacích aktualizace. Pokud zadaný dokument neexistuje, vloží se nový. Pokud ano existovat, pak se původní dokument aktualizuje (a nevloží se žádný dokument).

Upserts můžete provést zadáním upsert: true .

Příklad použití upsert: false

Nejprve je zde příklad pokusu o aktualizaci neexistujícího dokumentu, když upsert: false .

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

Výsledek:

null

Dokument v kolekci neexistoval, a proto findOneAndReplace() vrátil null . I když jsme výslovně nespecifikovali upsert: false , víme, že to bylo false, protože to je výchozí hodnota (tj. tato hodnota se použije, když nezadáte možnost upsert).

Když se znovu podíváme do sbírky, uvidíme, že dokument nebyl převrácený.

db.pets.find()

Výsledek:

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

Příklad použití upsert: true

Nyní je to zde znovu, ale tentokrát zadáme upsert: true .

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

Výsledek:

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

Tentokrát je upserted nový dokument a my vidíme upserted dokument jako výstup (protože jsme zadali returnNewDocument: true ).

Podívejme se znovu na sbírku.

db.pets.find()

Výsledek:

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

Můžeme tedy vidět, že nový dokument byl ve skutečnosti narušen.

sort Parametr

Můžete použít sort parametr k určení pořadí řazení pro dokumenty odpovídající filter .

Při použití sort parametr, hodnota 1 seřadí dokumenty ve vzestupném pořadí a na hodnotu -1 seřadí je v sestupném pořadí.

Argument je třeba poskytnout jako dokument. Například { sort: { "salary": 1 } } seřadí podle salary pole ve vzestupném pořadí.

Předpokládejme například, že vytvoříme kolekci nazvanou employees s následujícími dokumenty:

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

Mohli bychom spustit následující kód, abychom našli dokumenty s platem nižším než 60 000, a pak nahradili ten, který je z těchto dokumentů nejnižší.

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

Výsledek:

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

Zobrazí se dokument před jeho aktualizací. Podle očekávání byl zaměstnanec s nejnižší mzdou nahrazen novým platem (a novým jménem).

Takto nyní dokumenty vypadají.

db.employees.find()

Výsledek:

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

Takže vidíme, že Fritze nahradil Fluffy, který má mnohem lepší plat.

Vraťme to zpět k původnímu dokumentu.

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

Nyní spustíme stejné findOneAndReplace() kód znovu, ale tentokrát jej seřadíme v sestupném pořadí.

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

Výsledek:

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

Tentokrát byla nahrazena Sandy.

Podívejme se znovu na sbírku.

db.employees.find()

Výsledek:

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

Podle očekávání.

Další informace

db.collection.findOneAndReplace() metoda také přijímá další parametry, jako je projection (pro určení podmnožiny polí, která se mají vrátit), maxTimeMS a sort .

Viz dokumentaci MongoDB pro db.collections.findOneAndReplace() pro více informací.


  1. Redis failover s StackExchange / Sentinel z C#

  2. Oblasti stylu Azure Cache/DataCache v Redis

  3. Je MongoDB nějak omezeno na jedno jádro?

  4. Vytvořte webovou stránku internetového obchodu s potravinami pomocí Angular, NodeJS, Express a MongoDB