När du använder mongoimport
för att importera filer till MongoDB har du möjlighet att ange ett läge som ska användas. Dessa lägen avgör vad som händer om det redan finns matchande dokument i samlingen som du försöker importera till.
Som standard är mongoimport
använder insert
läge, men det finns andra lägen du kan använda. Vilket läge du använder beror på vad du försöker göra.
Nedan finns en översikt över varje läge tillsammans med exempel.
Lägen
De importlägen som är tillgängliga i mongoimport
är följande:
Läge | Beskrivning |
---|---|
insert | Detta är standardläget. Detta läge infogar dokumenten från importfilen. Om ett matchande dokument redan finns i samlingen uppstår ett fel. Ett matchande dokument är ett som har samma unika ID (som ett matchande _id ). fält) som ett dokument i importfilen. |
upsert | Ersätter befintliga dokument i databasen med matchande dokument från importfilen. Alla andra dokument infogas. |
merge | Sammanfogar befintliga dokument som matchar ett dokument i importfilen med det nya dokumentet. Alla andra dokument infogas. |
delete | Tar bort befintliga dokument i databasen som matchar ett dokument i importfilen. Alla icke-matchande dokument har ingen effekt. |
Exempel på hur varje läge fungerar finns nedan.
Infogningsläge
Anta att vi har en samling som heter pets
med följande dokument:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Det visade sig att de importerades i en fil som heter pets.json
.
Föreställ dig nu att vi har en annan JSON-fil som heter pets2.json
, som innehåller följande JSON-dokument:
{ "_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 }
Här är vad som händer om vi försöker importera det till våra pets
samling medan du använder (standard) insert
läge.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Utdata:
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.
Enligt det felmeddelandet importerades endast ett av de fyra dokumenten. De andra tre orsakade ett fel på grund av att de hade en dubblettnyckel i _id
fältet.
Låt oss nu titta 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 att det sista dokumentet infogades. Detta förväntas eftersom vi inte tidigare hade ett dokument med _id
värdet 4
.
Upsert Mode
Här är vad som händer om vi använder upsert
läge för att infoga samma dokument.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Utdata:
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.
Utdata berättar att 3 av de 4 dokumenten importerades framgångsrikt och att det inte förekom några misslyckanden.
Låt oss kolla in 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 att de tre första dokumenten har ersatts med dokumenten från importfilen. Det fjärde dokumentet förblir detsamma som det var efter föregående import.
Lägg märke till att det första dokumentet har förlorat sitt name
och type
fält. Detta beror på att upsert
läge ersätter hela dokumentet, och vårt ersättningsdokument har bara weight
fältet (liksom _id
fält).
Sammanfogningsläge
Låt oss ändra vår pets2.json
fil så att den ser ut så här:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Låt oss nu köra mongoimport
kommandot igen, men den här gången i merge
läge:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Utdata:
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.
Enligt resultatet importerades 3 dokument.
Låt oss ta en titt 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 att dokument 1 och 2 uppdaterades och dokument 5 infogades. Angående dokument 1, weight
fältet kvar trots att importdokumentet inte inkluderade det fältet. Detta beror på att vi använde merge
läge. Om vi hade använt upsert
läge (som i föregående exempel), weight
fältet skulle ha försvunnit.
Ta bort läge
När du använder delete
alla matchande dokument raderas helt enkelt. Icke-matchande dokument finns kvar i samlingen.
Så låt oss se vad som händer när vi importerar samma dokument, men den här gången byter du till delete
läge.
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.
Alla 5 dokument i samlingen raderades.
Ändra Upsert Field/s
Du kan använda --upsertFields
parameter för att ange ett annat fält än _id
att matcha mot. När du använder den här parametern skickar du fälten som en kommaseparerad lista.
Osäker på om du har mongoimport
?
mongoimport
är en del av MongoDB Database Tools-paketet. MongoDB Database Tools är en uppsättning kommandoradsverktyg för att arbeta med MongoDB.
Om du inte är säker på om du har MongoDB Database Tools/mongoimport
installerat, prova att köra följande kommando i din terminal eller kommandotolk för att kontrollera:
mongoimport --version
Om du har det bör du se versionsinformation etc. Om du inte har det kan du använda installationsinstruktionerna på MongoDB-webbplatsen för att installera det på ditt system.
Var du ska köra mongoimport
Kommandon?
Du måste köra mongoimport
kommandon från ditt systems kommandorad (t.ex. ett nytt terminal- eller kommandotolkfönster).
Kör dem inte från mongo
skal.