sql >> Databasteknik >  >> NoSQL >> MongoDB

Importsätten för mongoimport

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.


  1. php mongodb hitta n:e posten i samlingen

  2. Kräver Action Cable 5 Redis?

  3. Redis Support på sekundärt index

  4. Hur kan jag bläddra i eller fråga efter live MongoDB-data?