Podczas korzystania z mongoimport
aby zaimportować pliki do MongoDB, możesz określić tryb do użycia. Te tryby określają, co się stanie, jeśli w kolekcji, do której próbujesz zaimportować, znajdują się już pasujące dokumenty.
Domyślnie mongoimport
używa insert
tryb, ale istnieją inne tryby, których możesz użyć. Tryb, z którego korzystasz, będzie zależał od tego, co próbujesz zrobić.
Poniżej znajduje się przegląd każdego trybu wraz z przykładami.
Tryby
Tryby importu dostępne w mongoimport
są następujące:
Tryb | Opis |
---|---|
insert | To jest tryb domyślny. Ten tryb wstawia dokumenty z pliku importu. Jeśli pasujący dokument już istnieje w kolekcji, wystąpi błąd. Pasujący dokument to taki, który ma ten sam unikalny identyfikator (taki jak pasujący _id pole) jako dokument w pliku importu. |
upsert | Zastępuje istniejące dokumenty w bazie danych pasującymi dokumentami z pliku importu. Wszystkie inne dokumenty są wstawione. |
merge | Scala istniejące dokumenty, które pasują do dokumentu w pliku importu, z nowym dokumentem. Wszystkie inne dokumenty są wstawione. |
delete | Usuwa istniejące dokumenty w bazie danych, które pasują do dokumentu w pliku importu. Wszelkie niezgodne dokumenty nie mają wpływu. |
Poniżej znajdują się przykłady działania każdego trybu.
Tryb wstawiania
Załóżmy, że mamy kolekcję o nazwie pets
z następującymi dokumentami:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Jak się okazuje, zostały one zaimportowane w pliku o nazwie pets.json
.
Teraz wyobraź sobie, że mamy inny plik JSON o nazwie pets2.json
, który zawiera następujące 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 }
Oto, co się stanie, jeśli spróbujemy zaimportować to do naszych pets
zbieranie podczas używania (domyślnie) insert
tryb.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Wyjście:
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.
Zgodnie z tym komunikatem o błędzie zaimportowano tylko jeden z czterech dokumentów. Pozostałe trzy spowodowały błąd z powodu zduplikowanego klucza w _id
pole.
Przyjrzyjmy się teraz kolekcji.
db.pets.find()
Wynik:
{ "_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 }
Widzimy więc, że ostatni dokument został wstawiony. Jest to oczekiwane, ponieważ wcześniej nie mieliśmy dokumentu z _id
wartość 4
.
Tryb przesunięty
Oto, co się stanie, jeśli użyjemy upsert
tryb, aby wstawić ten sam dokument.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Wyjście:
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.
Dane wyjściowe mówią nam, że 3 z 4 dokumentów zostały pomyślnie zaimportowane i nie było żadnych błędów.
Sprawdźmy kolekcję.
db.pets.find()
Wynik:
{ "_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 }
Widzimy, że pierwsze trzy dokumenty zostały zastąpione dokumentami z pliku importu. Czwarty dokument pozostaje taki sam, jak po poprzednim imporcie.
Zauważ, że pierwszy dokument stracił swoją name
i type
pola. Dzieje się tak, ponieważ upsert
tryb zastępuje cały dokument, a nasz dokument zastępczy ma tylko weight
pole (jak również _id
pole).
Tryb scalania
Zmodyfikujmy nasz pets2.json
plik tak, aby wyglądał tak:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Teraz uruchommy mongoimport
polecenie ponownie, ale tym razem w merge
tryb:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Wyjście:
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.
Według danych wyjściowych zaimportowano 3 dokumenty.
Przyjrzyjmy się kolekcji.
db.pets.find()
Wynik:
{ "_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" }
Widzimy, że dokumenty 1 i 2 zostały zaktualizowane, a dokument 5 został wstawiony. Jeśli chodzi o dokument 1, weight
pole pozostało, mimo że dokument importu nie zawierał tego pola. Dzieje się tak, ponieważ użyliśmy merge
tryb. Gdybyśmy użyli upsert
tryb (jak w poprzednim przykładzie), weight
pole zniknęłoby.
Tryb usuwania
Kiedy używasz delete
w trybie, wszystkie pasujące dokumenty są po prostu usuwane. W kolekcji pozostają niepasujące dokumenty.
Zobaczmy więc, co się stanie, gdy zaimportujemy ten sam dokument, ale tym razem przełączmy się na delete
tryb.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Wynik:
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.
Wszystkie 5 dokumentów z kolekcji zostało usuniętych.
Zmiana pól upsert
Możesz użyć --upsertFields
parametr do określenia pola innego niż _id
do dopasowania. Używając tego parametru, przekaż pola jako listę oddzieloną przecinkami.
Nie jestem pewien, czy masz mongoimport
?
mongoimport
jest częścią pakietu MongoDB Database Tools. Narzędzia baz danych MongoDB to zestaw narzędzi wiersza poleceń do pracy z MongoDB.
Jeśli nie masz pewności, czy masz narzędzia bazy danych MongoDB/mongoimport
zainstalowany, spróbuj uruchomić następujące polecenie w terminalu lub wierszu polecenia, aby sprawdzić:
mongoimport --version
Jeśli go masz, powinieneś zobaczyć informacje o wersji itp. Jeśli go nie masz, możesz skorzystać z instrukcji instalacji na stronie MongoDB, aby zainstalować ją w swoim systemie.
Gdzie uruchomić mongoimport
Polecenia?
Musisz uruchomić mongoimport
polecenia z wiersza poleceń systemu (np. nowe okno terminala lub wiersza polecenia).
Nie uruchamiaj ich z mongo
powłoka.