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

MongoDB findAndModify()

V MongoDB db.collection.findAndModify() metoda upraví a vrátí jeden dokument.

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

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { 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, "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. Můžeme však také vidět, že pole názvu dokumentu zmizelo.

Je to proto, že když předáte dokument do update argument, db.collection.findAndModify() provede výměnu.

Použití aktualizačního operátora

Pokud bychom chtěli aktualizovat pole, ale ponechat zbytek dokumentu nedotčený, museli bychom do našeho dokumentu zahrnout příslušný výraz/y operátora aktualizace.

S kolekcí v jejím aktuálním stavu proveďte další findAndModify() operace proti němu, ale tentokrát použijeme $set aktualizovat operátor pro nastavení pouze pole, které chceme změnit.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { $set: { type: "Horse" } }
})

Výsledek:

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

Tentokrát byl aktualizován zbývající pes.

Pojďme se podívat na sbírku.

db.pets.find()

Výsledek:

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

Tentokrát bylo příslušné pole aktualizováno a zbytek dokumentu zůstal nedotčen.

Vraťte upravený dokument

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

Chcete-li místo toho vrátit upravený dokument, použijte new parametr.

Ve výchozím nastavení je to new: false , což má za následek vrácení původního dokumentu. Ale zadáním new: true výsledkem je místo toho vrácen upravený dokument.

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

db.pets.findAndModify({
    query: { name: "Meow" },
    update: { $set: { name: "Scratch" } },
    new: true
})

Výsledek:

{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Takže jsme přejmenovali Meow na Scratch a výstup odráží naše změny.

Upserts

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

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).

Příklad použití upsert: false

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

db.pets.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true
})

Výsledek:

null

Dokument v kolekci neexistoval, a proto findAndModify() 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.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true,
    upsert: true
})

Výsledek:

{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

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

Podívejme se znovu na sbírku.

db.pets.find()

Výsledek:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }
{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

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

Parametr arrayFilters

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.findAndModify({
   query: { scores: { $gte: 10 } },
   update: { $set: { "scores.$[e]" : 10 } },
   arrayFilters: [ { "e": { $gte: 10 } } ]
})

Výsledek:

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

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.findAndModify() metoda také přijímá další parametry, jako je writeConcern , collation , bypassDocumentValidation a další.

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


  1. Případy použití pro skóre Redis a funkce hodnocení pro sady

  2. takže vaše HBase je rozbitá

  3. Jak vytvořit místní servisní sběrnici založenou na Windows mimo Azure, podobnou Redis s automatickým převzetím služeb při selhání?

  4. Uložit podmnožinu sbírky MongoDB do jiné sbírky