Когато използвате mongoimport
за да импортирате файлове в MongoDB, имате възможност да посочите режим, който да използвате. Тези режими определят какво ще се случи, ако вече има съвпадащи документи в колекцията, в която се опитвате да импортирате.
По подразбиране mongoimport
използва insert
режим, но има и други режими, които можете да използвате. Режимът, който използвате, ще зависи от това, което се опитвате да направите.
По-долу е даден преглед на всеки режим заедно с примери.
Режимите
Режимите на импортиране, налични в mongoimport
са както следва:
Режим | Описание |
---|---|
insert | Това е режимът по подразбиране. Този режим вмъква документите от файла за импортиране. Ако съвпадащ документ вече съществува в колекцията, възниква грешка. Съвпадащ документ е този, който има същия уникален идентификатор (като съвпадащ _id поле) като документ във файла за импортиране. |
upsert | Заменя съществуващите документи в базата данни със съвпадащи документи от файла за импортиране. Всички останали документи са вмъкнати. |
merge | Обединява съществуващи документи, които съответстват на документ във файла за импортиране с новия документ. Всички останали документи са вмъкнати. |
delete | Изтрива съществуващи документи в базата данни, които съответстват на документ във файла за импортиране. Всички несъответстващи документи нямат ефект. |
Примери за това как работи всеки режим са по-долу.
Режим на вмъкване
Да предположим, че имаме колекция, наречена pets
със следните документи:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Както се оказва, те са импортирани във файл, наречен pets.json
.
Сега си представете, че имаме друг JSON файл, наречен pets2.json
, който съдържа следните 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 }
Ето какво се случва, ако се опитаме да импортираме това в нашите pets
събиране, докато използвате (по подразбиране) insert
режим.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Изход:
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.
Според това съобщение за грешка само един от четирите документа е импортиран. Останалите три причиниха грешка поради наличието на дублиран ключ в _id
поле.
Сега нека разгледаме колекцията.
db.pets.find()
Резултат:
{ "_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 }
Така че можем да видим, че последният документ е вмъкнат. Това се очаква, тъй като преди това не сме имали документ с _id
стойност на 4
.
Режим на качване
Ето какво се случва, ако използваме upsert
режим, за да вмъкнете същия документ.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Изход:
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.
Резултатът ни казва, че 3 от 4-те документа са импортирани успешно и че не е имало грешки.
Нека проверим колекцията.
db.pets.find()
Резултат:
{ "_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 }
Виждаме, че първите три документа са заменени с документите от файла за импортиране. Четвъртият документ остава същият, както беше след предишния импорт.
Забележете, че първият документ е загубил своето name
и type
полета. Това е така, защото upsert
режимът заменя целия документ, а нашият заместващ документ има само weight
полето (както и _id
поле).
Режим на сливане
Нека модифицираме нашия pets2.json
файл, така че да изглежда така:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Сега нека стартираме mongoimport
команда отново, но този път в merge
режим:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Изход:
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.
Според изхода са импортирани 3 документа.
Нека да разгледаме колекцията.
db.pets.find()
Резултат:
{ "_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" }
Виждаме, че документи 1 и 2 бяха актуализирани и документ 5 беше вмъкнат. По отношение на документ 1, weight
полето остава, въпреки че документът за импортиране не включва това поле. Това е така, защото използвахме merge
режим. Ако бяхме използвали upsert
режим (както в предишния пример), weight
полето би изчезнало.
Режим на изтриване
Когато използвате delete
режим, всички съответстващи документи просто се изтриват. Несъответстващи документи остават в колекцията.
Така че нека видим какво се случва, когато импортираме същия документ, но този път преминем към delete
режим.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Резултат:
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.
Всички 5 документа в колекцията бяха изтрити.
Промяна на полето/ите на Upsert
Можете да използвате --upsertFields
параметър, за да посочите поле, различно от _id
да съвпадат. Когато използвате този параметър, предайте полетата като списък, разделен със запетая.
Не съм сигурен дали имате mongoimport
?
mongoimport
е част от пакета MongoDB Database Tools. Инструментите за база данни на MongoDB са набор от помощни програми от командния ред за работа с MongoDB.
Ако не сте сигурни дали имате MongoDB Database Tools/mongoimport
инсталиран, опитайте да изпълните следната команда във вашия терминал или команден ред, за да проверите:
mongoimport --version
Ако го имате, трябва да видите информация за версията и т.н. Ако го нямате, можете да използвате инструкциите за инсталиране на уебсайта на MongoDB, за да го инсталирате на вашата система.
Къде да стартирате mongoimport
Команди?
Трябва да стартирате mongoimport
команди от командния ред на вашата система (например нов прозорец на терминал или команден ред).
Не ги стартирайте от mongo
черупка.