MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Режимите на импортиране на mongoimport

Когато използвате 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 черупка.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Заявка за ограничение/отместване на мангуста и броене

  2. намерете идентификатора на последния поддокумент, вмъкнат в mongoose

  3. Проверете съществуването на колекция в MongoDB

  4. Създайте многоезичен текстов индекс в MongoDB

  5. Mongo DB Java 3.x драйвер - групиране по заявка