Při použití mongoimport
pro import souborů do MongoDB máte možnost určit režim, který chcete použít. Tyto režimy určují, co se stane, pokud již v kolekci, do které se pokoušíte importovat, jsou odpovídající dokumenty.
Ve výchozím nastavení mongoimport
používá insert
režimu, ale můžete použít i další režimy. Režim, který použijete, bude záviset na tom, co se snažíte dělat.
Níže je uveden přehled každého režimu spolu s příklady.
Režimy
Režimy importu dostupné v mongoimport
jsou následující:
Režim | Popis |
---|---|
insert | Toto je výchozí režim. Tento režim vloží dokumenty z importovaného souboru. Pokud již odpovídající dokument v kolekci existuje, dojde k chybě. Odpovídající dokument je dokument, který má stejné jedinečné ID (například odpovídající _id pole) jako dokument v souboru importu. |
upsert | Nahradí existující dokumenty v databázi odpovídajícími dokumenty ze souboru importu. Všechny ostatní dokumenty jsou vloženy. |
merge | Sloučí existující dokumenty, které odpovídají dokumentu v importovaném souboru, s novým dokumentem. Všechny ostatní dokumenty jsou vloženy. |
delete | Odstraní existující dokumenty v databázi, které odpovídají dokumentu v importovaném souboru. Jakékoli neodpovídající dokumenty nemají žádný účinek. |
Příklady fungování jednotlivých režimů jsou uvedeny níže.
Režim vložení
Předpokládejme, že máme sbírku nazvanou pets
s následujícími dokumenty:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Jak se ukázalo, byly importovány do souboru s názvem pets.json
.
Nyní si představte, že máme další soubor JSON s názvem pets2.json
, který obsahuje následující dokumenty JSON:
{ "_id" : 1, "weight": 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }
Co se stane, když se to pokusíme importovat do našich pets
kolekce při použití (výchozí) insert
režimu.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Výstup:
2021-01-03T10:07:23.421+1000 connected to: mongodb://localhost/ 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 1 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 2 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 3 } 2021-01-03T10:07:23.423+1000 1 document(s) imported successfully. 3 document(s) failed to import.
Podle této chybové zprávy byl importován pouze jeden ze čtyř dokumentů. Další tři způsobily chybu kvůli duplicitnímu klíči v _id
pole.
Nyní se podíváme na sbírku.
db.pets.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }
Můžeme tedy vidět, že byl vložen poslední dokument. To se očekává, protože jsme dříve neměli dokument s _id
hodnotu 4
.
Režim Upsert
Co se stane, když použijeme upsert
režimu pro vložení stejného dokumentu.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Výstup:
2021-01-03T10:19:55.400+1000 connected to: mongodb://localhost/ 2021-01-03T10:19:55.444+1000 3 document(s) imported successfully. 0 document(s) failed to import.
Výstup nám říká, že 3 ze 4 dokumentů byly úspěšně importovány a že nedošlo k žádným selháním.
Podívejme se na sbírku.
db.pets.find()
Výsledek:
{ "_id" : 1, "weight" : 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }
Vidíme, že první tři dokumenty byly nahrazeny dokumenty ze souboru importu. Čtvrtý dokument zůstává stejný jako po předchozím importu.
Všimněte si, že první dokument ztratil svůj name
a type
pole. Je to proto, že upsert
režim nahradí celý dokument a náš náhradní dokument má pouze weight
pole (stejně jako _id
pole).
Režim sloučení
Upravme náš pets2.json
soubor tak, aby vypadal takto:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Nyní spustíme mongoimport
příkaz znovu, ale tentokrát v merge
režim:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Výstup:
2021-01-03T10:32:33.596+1000 connected to: mongodb://localhost/ 2021-01-03T10:32:33.607+1000 3 document(s) imported successfully. 0 document(s) failed to import.
Podle výstupu byly importovány 3 dokumenty.
Pojďme se podívat na sbírku.
db.pets.find()
Výsledek:
{ "_id" : 1, "weight" : 40, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Fetch", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 } { "_id" : 5, "name" : "Hop", "type" : "Kangaroo" }
Vidíme, že dokumenty 1 a 2 byly aktualizovány a dokument 5 byl vložen. Pokud jde o dokument 1, weight
pole zůstalo, i když importní dokument toto pole neobsahoval. Je to proto, že jsme použili merge
režimu. Pokud bychom použili upsert
režimu (jako v předchozím příkladu), weight
pole by zmizelo.
Režim mazání
Když použijete delete
režimu, všechny odpovídající dokumenty jsou jednoduše odstraněny. Neodpovídající dokumenty zůstávají ve sbírce.
Pojďme se tedy podívat, co se stane, když importujeme stejný dokument, ale tentokrát přepněte na delete
režimu.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Výsledek:
2021-01-03T10:39:38.925+1000 connected to: mongodb://localhost/ 2021-01-03T10:39:38.926+1000 5 document(s) deleted successfully. 0 document(s) failed to delete.
Všech 5 dokumentů ve sbírce bylo smazáno.
Změna pole/polí Upsert
Můžete použít --upsertFields
parametr k určení jiného pole než _id
zápasit proti. Při použití tohoto parametru předávejte pole jako seznam oddělený čárkami.
Nejsem si jistý, zda máte mongoimport
?
mongoimport
je součástí balíčku databázových nástrojů MongoDB. Databázové nástroje MongoDB jsou sada nástrojů příkazového řádku pro práci s MongoDB.
Pokud si nejste jisti, zda máte MongoDB Database Tools/mongoimport
nainstalovaný, zkuste spustit následující příkaz v terminálu nebo příkazovém řádku a zkontrolujte:
mongoimport --version
Pokud ji máte, měli byste vidět informace o verzi atd. Pokud ji nemáte, můžete ji nainstalovat do svého systému pomocí pokynů k instalaci na webu MongoDB.
Kde spustit mongoimport
Příkazy?
Musíte spustit mongoimport
příkazy z příkazového řádku vašeho systému (např. nový terminál nebo okno příkazového řádku).
Nespouštějte je z mongo
skořápka.