sql >> Database teknologi >  >> NoSQL >> MongoDB

Importmetoderne for mongoimport

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.


  1. Rediger og gentag MongoDB oplog

  2. returforespørgsel baseret på dato

  3. Operationelle faktorer at overveje under MongoDB-datamodellering

  4. SQL COALESCE() Forklaret