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

Jak spravovat dokumenty v MongoDB


Úvod

Při používání MongoDB strávíte většinu času nějakým způsobem správou dokumentů. Ať už vytváříte nové dokumenty a přidáváte je do kolekcí, získáváte dokumenty, aktualizujete data nebo ořezáváte zastaralé položky, dokumenty jsou středem modelu MongoDB.

V této příručce se budeme věnovat tomu, co jsou dokumenty MongoDB, a poté se budeme věnovat běžným operacím, o kterých budete pravděpodobně potřebovat vědět, abyste mohli spravovat prostředí zaměřené na dokumenty.



Co jsou dokumenty MongoDB?

V MongoDB jsou všechna data v rámci databází a kolekcí uložena v dokumentech. Protože kolekce standardně neurčují požadované schéma, dokumenty v kolekci mohou obsahovat libovolně složitou strukturu a nemusí odpovídat formátu používanému sourozeneckými dokumenty. To poskytuje neuvěřitelnou flexibilitu a umožňuje, aby se schéma organicky vyvíjelo podle toho, jak se mění požadavky aplikace.

Samotné dokumenty MongoDB používají formát serializace dat BSON, binární reprezentaci JSON JavaScript Object Notation. To poskytuje organizovanou strukturu s definovanými datovými typy, které lze programově dotazovat a ovládat.

Dokumenty BSON jsou reprezentovány dvojicí složených závorek ({} ), které obsahují páry klíč–hodnota. V BSON jsou tyto datové kuplety známé jako pole a jeho hodnotu . Pole je na prvním místě a je reprezentováno řetězcem. Hodnota může být jakýkoli platný datový typ BSON. Dvojtečka (: ) odděluje pole od jeho hodnoty. K oddělení každého páru polí a hodnot od sebe se používá čárka.

Jako příklad uvádíme platný dokument BSON, kterému MongoDB rozumí:

{    _id: 80380,    vehicle_type: "car",    mileage: 7377.80,    color: "blue",    markets: [        "US",        "UK"    ],    options: {        transmission: "automatic",        num_doors: 4,        power_windows: true    }}

Zde můžeme vidět několik typů:

  • _id je celé číslo
  • vehicle_type a color jsou struny
  • mileage je plovák
  • markets je pole řetězců
  • options obsahuje vnořený dokument s hodnotami sestávajícími z řetězce, celého čísla a boolean

Díky této flexibilitě jsou dokumenty poměrně flexibilním médiem pro ukládání dat. Nová pole lze snadno přidávat, dokumenty lze vkládat do sebe a složitost struktury přesně odpovídá uloženým datům.



Jak vytvářet nové dokumenty

Chcete-li vytvořit nový dokument, přejděte do databáze, do které chcete vytvořený dokument uložit. Použijeme school databáze pro demonstrační účely v tomto článku:

use school

Budete také chtít vybrat kolekci, kam chcete dokumenty vložit. Stejně jako u databází nemusíte explicitně vytvářet kolekci, kam chcete dokument vložit. MongoDB jej automaticky vytvoří, když jsou zapsána první data. V tomto příkladu použijeme kolekci nazvanou students .

Nyní, když víte, kam bude dokument uložen, můžete vložit nový dokument pomocí jedné z následujících metod.


Použití insert() metoda

insert() umožňuje vložit jeden nebo více dokumentů do kolekce, na kterou je volána.

Chcete-li vložit jeden dokument, předejte dokument metodě jejím voláním v kolekci. Zde vložíme nový dokument pro studenta jménem Ashley:

db.students.insert(    {        first_name: "Ashley",        last_name: "Jenkins",        dob: new Date("January 08, 2003"),        grade_level: 8    })
WriteResult({ "nInserted" : 1 })

Pokud chcete vložit více než jeden dokument současně, místo předávání dokumentu do insert() , předat řadu dokumentů. Můžeme přidat dva nové dokumenty pro studenty jménem Brian a Leah:

db.students.insert(    [        {            first_name: "Brian",            last_name: "McMantis",            dob: new Date("September 18, 2010"),            grade_level: 2        },        {            first_name: "Leah",            last_name: "Drake",            dob: new Date("October 03, 2009")        }    ])
BulkWriteResult({        "writeErrors" : [ ],        "writeConcernErrors" : [ ],        "nInserted" : 2,        "nUpserted" : 0,        "nMatched" : 0,        "nModified" : 0,        "nRemoved" : 0,        "upserted" : [ ]})

Protože jsme provedli operaci hromadného zápisu, naše návratová hodnota je BulkWriteResult místo WriteResult objekt, který jsme viděli dříve.

Zatímco insert() metoda je flexibilní, v mnoha ovladačích MongoDB byla zastaralá ve prospěch následujících dvou metod.



Použití insertOne() metoda

insertOne() metodu lze použít pro vložení jednoho dokumentu. Na rozdíl od insert() může vkládat pouze jeden dokument najednou, což činí jeho chování o něco předvídatelnějším.

Syntaxe je stejná jako při použití insert() přidat jeden dokument. Můžeme přidat dalšího studenta jménem Naomi:

db.students.insertOne(    {        first_name: "Naomi",        last_name: "Pyani"    })
{        "acknowledged" : true,        "insertedId" : ObjectId("60e877914655cbf49ff7cb86")}

Na rozdíl od insert() , insertOne() metoda vrací dokument obsahující některé další užitečné informace. Potvrzuje, že zápis byl potvrzen klastrem, a obsahuje ID objektu, které bylo přiřazeno dokumentu, protože jsme žádné neposkytli.



Použití insertMany() metoda

Chcete-li pokrýt scénáře, kdy chcete vložit více dokumentů najednou, použijte insertMany() metoda je nyní doporučena. Stejně jako při vkládání více dokumentů pomocí insert() , insertMany() bere řadu dokumentů.

Můžeme přidat tři nové studenty jménem Jasmine, Michael a Toni:

db.students.insertMany(    [        {            first_name: "Jasmine",            last_name: "Took",            dob: new Date("April 11, 2011")        },        {            first_name: "Michael",            last_name: "Rodgers",            dob: new Date("February 25, 2008"),            grade_level: 6        },        {            first_name: "Toni",            last_name: "Fowler"        }    ])
{        "acknowledged" : true,        "insertedIds" : [                ObjectId("60e8792d4655cbf49ff7cb87"),                ObjectId("60e8792d4655cbf49ff7cb88"),                ObjectId("60e8792d4655cbf49ff7cb89")        ]}

Stejně jako u insertOne() , insertMany() vrací dokument, který potvrzuje zápis a poskytuje pole obsahující ID, která byla přiřazena vloženým dokumentům.




Jak se dotazovat na existující dokumenty

Dotazování dokumentů je poměrně rozsáhlé téma, které si zaslouží vlastní článek. Podrobnosti o tom, jak formulovat dotazy pro načtení různých typů dokumentů, najdete v našem průvodci dotazováním na data v MongoDB.

I když je nejlepší ponechat podrobnosti ve výše odkazovaném článku, můžeme alespoň pokrýt metody, které MongoDB poskytuje k dotazování dokumentů. Hlavním způsobem, jak načíst dokumenty z MongoDB, je volání find() metodu u příslušné sbírky.

Například shromáždit všechny dokumenty od students , můžete zavolat find() bez argumentů:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb85"), "first_name" : "Leah", "last_name" : "Drake", "dob" : ISODate("2009-10-03T00:00:00Z") }{ "_id" : ObjectId("60e877914655cbf49ff7cb86"), "first_name" : "Naomi", "last_name" : "Pyani" }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb87"), "first_name" : "Jasmine", "last_name" : "Took", "dob" : ISODate("2011-04-11T00:00:00Z") }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

Aby byl výstup čitelnější, můžete také zřetězit pretty() metoda za find() :

db.<collection>.find().pretty()
{        "_id" : ObjectId("60e8743b4655cbf49ff7cb83"),        "first_name" : "Ashley",        "last_name" : "Jenkins",        "dob" : ISODate("2003-01-08T00:00:00Z"),        "grade_level" : 8}{        "_id" : ObjectId("60e875d54655cbf49ff7cb84"),        "first_name" : "Brian",        "last_name" : "McMantis",        "dob" : ISODate("2010-09-18T00:00:00Z"),        "grade_level" : 2}{        "_id" : ObjectId("60e875d54655cbf49ff7cb85"),        "first_name" : "Leah",        "last_name" : "Drake",        "dob" : ISODate("2009-10-03T00:00:00Z")}{        "_id" : ObjectId("60e877914655cbf49ff7cb86"),        "first_name" : "Naomi",        "last_name" : "Pyani"}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb87"),        "first_name" : "Jasmine",        "last_name" : "Took",        "dob" : ISODate("2011-04-11T00:00:00Z")}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb88"),        "first_name" : "Michael",        "last_name" : "Rodgers",        "dob" : ISODate("2008-02-25T00:00:00Z"),       "grade_level" : 6}{        "_id" : ObjectId("60e8792d4655cbf49ff7cb89"),        "first_name" : "Toni",        "last_name" : "Fowler"}

Můžete vidět, že _id pole bylo přidáno ke každému z dokumentů. MongoDB vyžaduje jedinečné _id pro každý dokument ve sbírce. Pokud při vytváření objektu žádný nezadáte, přidá ho za vás. Toto ID můžete použít ke spolehlivému načtení jednoho objektu:

db.students.find(    {        _id : ObjectId("60e8792d4655cbf49ff7cb89")    })
{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler" }

Více o různých způsobech dotazování na data se můžete dozvědět ve výše uvedeném článku.



Jak aktualizovat stávající dokumenty

Mnoho nebo většina případů použití databází vyžaduje, abyste mohli upravovat existující data v databázi. Pole může být nutné aktualizovat, aby odráželo novou hodnotu, nebo možná budete muset přidat další informace k existujícímu dokumentu, jakmile bude k dispozici.

MongoDB používá k aktualizaci existujících dokumentů několik souvisejících metod:

  • updateOne() :Aktualizuje jeden dokument v rámci kolekce na základě poskytnutého filtru.
  • updateMany() :Aktualizuje více dokumentů v rámci kolekce, které odpovídají poskytnutému filtru.
  • replaceOne() :Nahradí celý dokument v kolekci na základě poskytnutého filtru.

Probereme, jak používat každou z těchto odrůd k provádění různých typů aktualizací.


Operátory aktualizace

Než se podíváme na jednotlivé způsoby aktualizace dokumentů, měli bychom si projít některé dostupné operátory aktualizací.

  • $currentDate :Nastaví hodnotu pole na aktuální datum, buď jako typ data nebo časového razítka.
    • Syntaxe:{ $currentDate: { <field>: <type>, ... } }
  • $inc :Zvyšuje hodnotu pole o nastavenou hodnotu.
    • Syntaxe:{ $inc: { <field>: <amount>, ... } }
  • $min :Aktualizuje hodnotu pole, pokud je zadaná hodnota menší než aktuální hodnota.
    • Syntaxe:{ $min: { <field>: <value>, ... } }
  • $max :Aktualizuje hodnotu pole, pokud je zadaná hodnota vyšší než aktuální hodnota.
    • Syntaxe:{ $max: { <field>: <value>, ... } }
  • $mul :Aktualizuje hodnotu pole vynásobením daným číslem.
    • Syntaxe:{ $mul: { <field>: <value>, ... } }
  • $rename :Přejmenuje název pole na nový identifikátor.
    • Syntaxe:{ $rename: { <field>: <new_name>, ... } }
  • $set :Nahradí hodnotu pole danou hodnotou.
    • Syntaxe:{ $set: { <field>: value, ... } }
  • $setOnInsert :Během operací upsert nastavuje hodnotu pole, pokud se vytváří nový dokument, a nedělá nic jiného.
    • Syntaxe:{ $setOnInsert: { <field>: <value>, ... } }
  • $unset :Odebere pole z dokumentu.
    • Syntaxe:{ $unset: { <field>: "", ... } }
  • $ :Zástupný symbol pro první prvek pole, který vyhovuje dotazu.
    • Syntaxe:{ <update_operator>: {<array>.$: <value> } }
  • $[] :Zástupný symbol pro všechny prvky pole, které splňují dotaz.
    • Syntaxe:{ <update_operator>: { <array>.$[]: <value> } }
  • $addToSet :Přidá hodnoty do pole, pokud již nejsou přítomny.
    • Syntaxe:{ $addToSet: { <field>: <value>, ... } }
  • $pop :Odebere první nebo poslední prvek pole.
    • Syntaxe:{ $pop: { <field>: (-1 or 1), ... } }
  • $pull :Odebere všechny prvky pole, které odpovídají podmínce.
    • Syntaxe:{ $pull: { <field>: <condition>, ... } }
  • $push :Připojí hodnotu k poli.
    • Syntaxe:{ $push: { <field>: <value>, ... } }
  • $pullAll :Odebere všechny zadané prvky z pole.
    • Syntaxe:{ $pullAll: { <field>: [ <value>, ... ], ...} }
  • $each :Upravuje $addToSet a $push operátory tak, že přidají každý prvek pole místo pole jako jeden prvek.
    • Syntaxe:{ <update_operator>: { <field>: { $each: [ <value>, ... ] }, ... } }
  • $position :Používá se s $each a určuje pozici $push operátor by měl vložit at.
    • Syntaxe:{ $push: { <field>: { $each: [ <value>, ... ], $position: <num> } } }
  • $slice :Používá se s $each a $push k omezení počtu celkových prvků v poli.
    • Syntaxe:{ $push: { <field>: { $each: [ <value>, ... ], $slice: <num> } } }
  • $sort :Používá se s $each a $push k řazení prvků pole.
    • Syntaxe:{ $push: { <field>: { $each: [ <value>, ... ], $sort: <sort_order> } } }

Tyto různé aktualizační operátory vám umožňují aktualizovat různá pole vašich dokumentů různými způsoby.



Aktualizace jednoho dokumentu ve sbírce

updateOne() MongoDB metoda se používá k aktualizaci jednoho dokumentu v rámci kolekce. Metoda vyžaduje dva požadované argumenty a také dokument specifikující volitelné argumenty.

První argument je dokument, který určuje podmínky filtru, které se použijí pro výběr dokumentů. Od updateOne() metoda upraví maximálně jeden dokument v kolekci, bude použit první dokument, který splňuje podmínky filtru.

Druhý argument určuje operaci aktualizace, která by měla být provedena. Výše uvedené aktualizační operace lze zadat zde, aby se změnil obsah odpovídajícího dokumentu.

Třetí argument je dokument s různými možnostmi pro úpravu chování metody. Nejdůležitější potenciální hodnoty jsou:

  • upsert :Pokud filtr neodpovídá žádným existujícím dokumentům, změní operaci na proceduru upsert vložením nového dokumentu.
  • collation :Dokument, který definuje pravidla specifická pro daný jazyk, která by měla platit pro operaci.

Jako příklad můžeme aktualizovat jeden záznam studenta, který filtrujeme podle _id pole, abychom zajistili, že zacílíme na správný dokument. Můžeme nastavit grade_level na novou hodnotu:

db.students.updateOne(    { _id: ObjectId("60e8792d4655cbf49ff7cb89") },    { $set: { grade_level: 3 } })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }


Aktualizace více dokumentů v kolekci

updateMany() MongoDB metoda funguje podobně jako updateOne() metoda, ale místo toho aktualizuje jakýkoli dokument, který odpovídá danému filtru, namísto zastavení po první shodě.

updateMany() syntaxe přesně odpovídá updateOne() syntaxe, takže jediným rozdílem je rozsah operace.

Například, pokud chceme změnit všechny výskyty "kompozice" na "psaní" v subjects pole v našich teachers sběrné dokumenty, mohli bychom použít něco takového:

db.teachers.updateMany(    { subject: "composition" },    { $set: { "subjects.$": "writing" } })
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Pokud zkontrolujete dokumenty, každý výskyt „složení“ by měl být nahrazen výrazem „psaní“:

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Nancy", "last_name" : "Smith", "subjects" : [ "vocabulary", "pronunciation" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }


Nahrazení dokumentu

replaceOne() metoda funguje podobně jako updateOne() metoda, ale nahradí celý dokument namísto aktualizace jednotlivých polí. Syntaxe je stejná jako u předchozích dvou příkazů.

Pokud například Nancy Smith odejde z vaší školy a vy ji nahradíte učitelkou jménem Clara Newman, která vyučuje literaturu, můžete zadat následující:

db.teachers.replaceOne(    {        $and: [             { first_name: "Nancy" },            { last_name: "Smith" }        ]    },    {        first_name: "Clara",        last_name: "Newman",        subjects: [ "literature" ]    })
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

Můžete vidět, že odpovídající dokument byl odstraněn a že jej zadaný dokument nahradil:

db.teachers.find()
{ "_id" : ObjectId("60eddca65eb74f5c676f3baa"), "first_name" : "Clara", "last_name" : "Newman", "subjects" : [ "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bab"), "first_name" : "Ronald", "last_name" : "Taft", "subjects" : [ "literature", "grammar", "writing" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bac"), "first_name" : "Casey", "last_name" : "Meyers", "subjects" : [ "literature", "writing", "grammar" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bad"), "first_name" : "Rebecca", "last_name" : "Carrie", "subjects" : [ "grammar", "literature" ] }{ "_id" : ObjectId("60eddca65eb74f5c676f3bae"), "first_name" : "Sophie", "last_name" : "Daggs", "subjects" : [ "literature", "writing", "grammar", "vocabulary", "pronunciation" ] }



Jak odstranit dokumenty

Součástí životního cyklu dokumentu je také odstraňování dokumentů ze sbírek. Chcete-li dokument odstranit, můžete použít deleteOne() nebo deleteMany() metody. Mají stejnou syntaxi a liší se pouze v počtu dokumentů, na kterých pracují.

Z velké části stačí k odstranění dokumentů některou z těchto metod pouze poskytnout dokument filtru, který určuje, jak chcete vybrat dokument, který má být odstraněn. deleteOne() metoda smaže maximálně jeden dokument (bez ohledu na to, kolik shod filtr vytvoří), zatímco deleteMany() metoda odstraní každý dokument, který odpovídá podmínkám filtru.

Chcete-li například odstranit jednoho studenta, můžete zadat _id k jejich explicitní shodě:

db.students.deleteOne({    _id: ObjectId("60e8792d4655cbf49ff7cb87")})
{ "acknowledged" : true, "deletedCount" : 1 }

Pokud chceme smazat libovolného studenta, který nemá přiřazenou známku, můžeme použít deleteMany() metoda místo toho:

db.students.deleteMany({    grade_level: { $eq: null }})
{ "acknowledged" : true, "deletedCount" : 2 }

Pokud zkontrolujeme, měli bychom vidět, že všichni zbývající studenti mají přiřazenou úroveň:

db.students.find()
{ "_id" : ObjectId("60e8743b4655cbf49ff7cb83"), "first_name" : "Ashley", "last_name" : "Jenkins", "dob" : ISODate("2003-01-08T00:00:00Z"), "grade_level" : 8 }{ "_id" : ObjectId("60e875d54655cbf49ff7cb84"), "first_name" : "Brian", "last_name" : "McMantis", "dob" : ISODate("2010-09-18T00:00:00Z"), "grade_level" : 2 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb88"), "first_name" : "Michael", "last_name" : "Rodgers", "dob" : ISODate("2008-02-25T00:00:00Z"), "grade_level" : 6 }{ "_id" : ObjectId("60e8792d4655cbf49ff7cb89"), "first_name" : "Toni", "last_name" : "Fowler", "grade_level" : 3 }


Závěr

Naučte se, jak vytvářet, dotazovat se, aktualizovat a odstraňovat dokumenty, získáte dovednosti, které potřebujete k efektivní každodenní správě dokumentů v MongoDB. Seznámení s různými metodami dokumentů a sběru a operátory, které vám umožňují porovnávat a upravovat informace, vám umožní vyjádřit složité myšlenky, kterým databázový systém rozumí.




  1. 9 funkcí ClusterControl, které nenajdete v jiných nástrojích pro správu databází

  2. Slovník Pythonu:odstranění u' znaků

  3. mongorestore se nezdařilo:žádné dostupné servery

  4. Jak používat desítkový typ v MongoDB