Bei Verwendung von mongoimport
Um Dateien in MongoDB zu importieren, haben Sie die Möglichkeit, einen zu verwendenden Modus anzugeben. Diese Modi bestimmen, was passiert, wenn es bereits übereinstimmende Dokumente in der Sammlung gibt, in die Sie zu importieren versuchen.
Standardmäßig mongoimport
verwendet insert
Modus, aber es gibt noch andere Modi, die Sie verwenden können. Welchen Modus Sie verwenden, hängt davon ab, was Sie tun möchten.
Nachfolgend finden Sie eine Übersicht über jeden Modus zusammen mit Beispielen.
Die Modi
Die in mongoimport
verfügbaren Importmodi lauten wie folgt:
Modus | Beschreibung |
---|---|
insert | Dies ist der Standardmodus. Dieser Modus fügt die Dokumente aus der Importdatei ein. Wenn bereits ein übereinstimmendes Dokument in der Sammlung vorhanden ist, tritt ein Fehler auf. Ein übereinstimmendes Dokument ist eines, das dieselbe eindeutige ID hat (z. B. eine übereinstimmende _id Feld) als Dokument in der Importdatei. |
upsert | Ersetzt vorhandene Dokumente in der Datenbank durch passende Dokumente aus der Importdatei. Alle anderen Dokumente werden eingefügt. |
merge | Führt vorhandene Dokumente, die mit einem Dokument in der Importdatei übereinstimmen, mit dem neuen Dokument zusammen. Alle anderen Dokumente werden eingefügt. |
delete | Löscht vorhandene Dokumente in der Datenbank, die mit einem Dokument in der Importdatei übereinstimmen. Alle nicht übereinstimmenden Dokumente haben keine Auswirkung. |
Beispiele für die Funktionsweise der einzelnen Modi finden Sie unten.
Einfügemodus
Angenommen, wir haben eine Sammlung namens pets
mit folgenden Dokumenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Wie sich herausstellt, wurden diese in eine Datei namens pets.json
importiert .
Stellen Sie sich nun vor, wir hätten eine weitere JSON-Datei namens pets2.json
, das die folgenden JSON-Dokumente enthält:
{ "_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 }
Folgendes passiert, wenn wir versuchen, das in unsere pets
zu importieren Sammlung, während (Standardeinstellung) insert
verwendet wird Modus.
mongoimport --db=PetHotel --collection=pets --file=pets2.json
Ausgabe:
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.
Laut dieser Fehlermeldung wurde nur eines der vier Dokumente importiert. Die anderen drei verursachten einen Fehler, weil sie einen doppelten Schlüssel in der _id
hatten Feld.
Sehen wir uns nun die Sammlung an.
db.pets.find()
Ergebnis:
{ "_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 }
So können wir sehen, dass das letzte Dokument eingefügt wurde. Dies ist zu erwarten, da wir zuvor kein Dokument mit einer _id
hatten Wert von 4
.
Upsert-Modus
Folgendes passiert, wenn wir upsert
verwenden Modus, um dasselbe Dokument einzufügen.
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
Ausgabe:
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.
Die Ausgabe sagt uns, dass 3 der 4 Dokumente erfolgreich importiert wurden und dass es keine Fehler gab.
Sehen wir uns die Sammlung an.
db.pets.find()
Ergebnis:
{ "_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 }
Wir können sehen, dass die ersten drei Dokumente durch die Dokumente aus der Importdatei ersetzt wurden. Das vierte Dokument bleibt unverändert wie nach dem vorherigen Import.
Beachten Sie, dass das erste Dokument seinen name
verloren hat und type
Felder. Das liegt daran, dass upsert
Modus ersetzt das gesamte Dokument, und unser Ersatzdokument hat nur das weight
Feld (sowie die _id
Feld).
Zusammenführungsmodus
Lassen Sie uns unsere pets2.json
ändern Datei so, dass es so aussieht:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
Lassen Sie uns nun den mongoimport
ausführen Befehl erneut, aber diesmal in merge
Modus:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
Ausgabe:
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.
Laut Ausgabe wurden 3 Dokumente importiert.
Werfen wir einen Blick auf die Sammlung.
db.pets.find()
Ergebnis:
{ "_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" }
Wir können sehen, dass die Dokumente 1 und 2 aktualisiert wurden und Dokument 5 eingefügt wurde. Bezüglich Dokument 1, das weight
Feld blieb bestehen, obwohl das Importdokument dieses Feld nicht enthielt. Das liegt daran, dass wir merge
verwendet haben Modus. Wenn wir upsert
verwendet hätten mode (wie im vorigen Beispiel), das weight
wäre verschwunden.
Löschmodus
Wenn Sie delete
verwenden Modus werden alle übereinstimmenden Dokumente einfach gelöscht. Nicht übereinstimmende Dokumente verbleiben in der Sammlung.
Sehen wir uns also an, was passiert, wenn wir dasselbe Dokument importieren, diesmal aber auf delete
umschalten Modus.
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
Ergebnis:
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 Dokumente in der Sammlung wurden gelöscht.
Ändern der Upsert-Felder
Sie können die --upsertFields
verwenden -Parameter, um ein anderes Feld als _id
anzugeben gegen zu passen. Wenn Sie diesen Parameter verwenden, übergeben Sie die Felder als kommagetrennte Liste.
Nicht sicher, ob Sie mongoimport
haben ?
mongoimport
ist Teil des MongoDB Database Tools-Pakets. Die MongoDB-Datenbanktools sind eine Reihe von Befehlszeilendienstprogrammen für die Arbeit mit MongoDB.
Wenn Sie sich nicht sicher sind, ob Sie die MongoDB Database Tools/mongoimport
installiert haben, versuchen Sie, den folgenden Befehl in Ihrem Terminal oder Ihrer Eingabeaufforderung auszuführen, um dies zu überprüfen:
mongoimport --version
Wenn Sie es haben, sollten Sie Versionsinformationen usw. sehen. Wenn Sie es nicht haben, können Sie die Installationsanweisungen auf der MongoDB-Website verwenden, um es auf Ihrem System zu installieren.
Wo soll mongoimport
ausgeführt werden Befehle?
Sie müssen mongoimport
ausführen Befehle über die Befehlszeile Ihres Systems (z. B. ein neues Terminal- oder Eingabeaufforderungsfenster).
Führen Sie sie nicht vom mongo
aus Hülse.