Når du bruger mongoimport
for at importere filer til MongoDB, har du mulighed for at angive en tilstand, der skal bruges. Disse tilstande bestemmer, hvad der sker, hvis der allerede er matchende dokumenter i den samling, som du forsøger at importere til.
Som standard er mongoimport
bruger insert
tilstand, men der er andre tilstande, du kan bruge. Den tilstand, du bruger, afhænger af, hvad du prøver at gøre.
Nedenfor er en oversigt over hver tilstand sammen med eksempler.
Tilstandene
De tilgængelige importtilstande i mongoimport
er som følger:
Tilstand | Beskrivelse |
---|---|
insert | Dette er standardtilstanden. Denne tilstand indsætter dokumenterne fra importfilen. Hvis der allerede findes et matchende dokument i samlingen, opstår der en fejl. Et matchende dokument er et, der har det samme unikke ID (såsom et matchende _id ). felt) som et dokument i importfilen. |
upsert | Erstatter eksisterende dokumenter i databasen med matchende dokumenter fra importfilen. Alle andre dokumenter er indsat. |
merge | Fletter eksisterende dokumenter, der matcher et dokument i importfilen, med det nye dokument. Alle andre dokumenter er indsat. |
delete | Sletter eksisterende dokumenter i databasen, der matcher et dokument i importfilen. Ikke-matchende dokumenter har ingen effekt. |
Eksempler på, hvordan hver tilstand fungerer, er nedenfor.
Indsæt tilstand
Antag, at vi har en samling kaldet pets
med følgende dokumenter:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Som det viser sig, blev disse importeret i en fil kaldet pets.json
.
Forestil dig nu, at vi har en anden JSON-fil kaldet pets2.json
, der indeholder følgende JSON-dokumenter:
{ "_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 }
Her er, hvad der sker, hvis vi forsøger at importere det til vores pets
samling, mens du bruger (standard) insert
tilstand.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Output:
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.
Ifølge den fejlmeddelelse blev kun ét af de fire dokumenter importeret. De andre tre forårsagede en fejl på grund af at have en dubletnøgle i _id
felt.
Lad os nu se på samlingen.
db.pets.find()
Resultat:
{ "_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 }
Så vi kan se, at det sidste dokument blev indsat. Dette forventes, fordi vi ikke tidligere havde et dokument med et _id
værdi af 4
.
Upsert Mode
Her er, hvad der sker, hvis vi bruger upsert
tilstand for at indsætte det samme dokument.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Output:
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.
Outputtet fortæller os, at 3 af de 4 dokumenter blev importeret med succes, og at der ikke var nogen fejl.
Lad os tjekke samlingen.
db.pets.find()
Resultat:
{ "_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 }
Vi kan se, at de første tre dokumenter er blevet erstattet med dokumenterne fra importfilen. Det fjerde dokument forbliver det samme, som det var efter den forrige import.
Bemærk, at det første dokument har mistet sit name
og type
felter. Dette er fordi upsert
tilstand erstatter hele dokumentet, og vores erstatningsdokument har kun weight
felt (samt _id
Mark).
Fletningstilstand
Lad os ændre vores pets2.json
fil, så den ser sådan ud:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Lad os nu køre mongoimport
kommandoen igen, men denne gang i merge
tilstand:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Output:
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.
Ifølge outputtet blev 3 dokumenter importeret.
Lad os tage et kig på samlingen.
db.pets.find()
Resultat:
{ "_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" }
Vi kan se, at dokument 1 og 2 blev opdateret, og dokument 5 blev indsat. Med hensyn til dokument 1, weight
feltet forblev, selvom importdokumentet ikke inkluderede dette felt. Dette skyldes, at vi brugte merge
mode. Hvis vi havde brugt upsert
tilstand (som i det foregående eksempel), weight
felt ville være forsvundet.
Slet tilstand
Når du bruger delete
tilstand slettes alle matchende dokumenter simpelthen. Ikke-matchende dokumenter forbliver i samlingen.
Så lad os se, hvad der sker, når vi importerer det samme dokument, men denne gang skifter til delete
tilstand.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Resultat:
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.
Alle 5 dokumenter i samlingen blev slettet.
Ændring af Upsert Field/s
Du kan bruge --upsertFields
parameter for at angive et andet felt end _id
at matche imod. Når du bruger denne parameter, skal du sende felterne som en kommasepareret liste.
Ikke sikker på, om du har mongoimport
?
mongoimport
er en del af MongoDB Database Tools-pakken. MongoDB-databaseværktøjerne er en række kommandolinjeværktøjer til at arbejde med MongoDB.
Hvis du ikke er sikker på, om du har MongoDB Database Tools/mongoimport
installeret, prøv at køre følgende kommando i din terminal eller kommandoprompt for at kontrollere:
mongoimport --version
Hvis du har det, bør du se versionsoplysninger osv. Hvis du ikke har det, kan du bruge installationsinstruktionerne på MongoDB-webstedet til at installere det på dit system.
Hvor skal mongoimport
køres Kommandoer?
Du skal køre mongoimport
kommandoer fra dit systems kommandolinje (f.eks. et nyt terminal- eller kommandopromptvindue).
Kør dem ikke fra mongo
skal.