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

MongoDB findOneAndUpdate()

V MongoDB db.collection.findOneAndUpdate() metoda aktualizuje jeden dokument na základě filter a sort kritéria.

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.findOneAndUpdate() způsob aktualizace jednoho z těchto dokumentů.

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

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

Vidíme, že první dokument nyní obsahuje místo psa krávu.

Vraťte upravený dokument

Ve výchozím nastavení se při použití db.collection.findOneAndUpdate() 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.findOneAndUpdate(
    { "type": "Dog" },
    { $set: { "type": "Horse" } },
    { returnNewDocument: true }
)

Výsledek:

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

Tentokrát byl aktualizován druhý pes. V tomto případě jsme to změnili na koně a vidíme, že návratový dokument to odráží.

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.findOneAndUpdate(
    { "_id": 4 },
    { $set: { "name": "Barry", "type": "Badger" } },
    { 
        returnNewDocument: true 
    }
)

Výsledek:

null

Dokument v kolekci neexistoval, a proto findOneAndUpdate() vrátil null . I když jsme 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, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Příklad použití upsert: true

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

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

Výsledek:

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

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" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }

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

arrayFilters Parametr

Při práci s poli můžete použít arrayFilters parametr spolu s pozičním $ operátor k určení, které prvky pole se mají aktualizovat. To vám umožní aktualizovat prvek pole na základě jeho hodnoty, i když neznáte jeho pozici.

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

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

Mohli bychom spustit následující dotaz, abychom aktualizovali pouze ty prvky pole, které mají hodnotu vyšší než určité množství (v tomto případě 10).

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

Výsledek:

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

Zobrazí se dokument před jeho aktualizací. Podle očekávání se aktualizuje pouze jeden dokument, i když dva dokumenty odpovídají kritériím.

Takto nyní dokumenty vypadají.

db.players.find()

Výsledek:

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

Dokument 2 měl aktualizovány dva prvky pole, protože tyto prvky odpovídaly kritériím.

Další informace

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

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


  1. Mongodb Healthcheck krok za krokem

  2. Zkontrolujte existenci kolekce v MongoDB

  3. Redis pipeline pořadí provedení

  4. Nelze vytvořit index v mongodb, klíč je příliš velký na indexování