Wie exportiere ich eine Sammlung nach CSV in MongoDB?

96

Wie exportieren Sie alle Datensätze in einer MongoDB-Sammlung in eine .csvDatei?

mongoexport --host localhost --db dbname --collection name --type=csv > test.csv

Hiermit werde ich aufgefordert, den Namen der Felder anzugeben, die exportiert werden müssen. Kann ich einfach alle Felder exportieren, ohne die Namen der Felder anzugeben?

Erfolg Stha
quelle

Antworten:

111

@ Karoly-Horvath hat es richtig. Für csv sind Felder erforderlich.

Entsprechend diesem Fehler im MongoDB Issue Tracker https://jira.mongodb.org/browse/SERVER-4224 MÜSSEN Sie die Felder beim Exportieren in eine CSV angeben . Die Dokumente sind nicht klar. Das ist der Grund für den Fehler.

Versuche dies:

mongoexport --host localhost --db dbname --collection name --csv --out text.csv --fields firstName,middleName,lastName

AKTUALISIEREN:

Dieses Commit: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 behebt die Dokumente für 3.0.0-rc10 und höher. Es ändert

Fields string `long:"fields" short:"f" description:"comma separated list of field names, e.g. -f name,age"`

zu

Fields string `long:"fields" short:"f" description:"comma separated list of field names (required for exporting CSV) e.g. -f \"name,age\" "`

VERSION 3.0 UND OBEN:

Sie sollten --type=csvanstelle von verwenden, --csvda es veraltet ist.

Weitere Details: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Voller Befehl:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
Campeterson
quelle
16
Ab Version 3.0.6 mongoexportheißt escsv flag is deprecated; please use --type=csv instead
Roman Dibikhin
Vielen Dank (an anonym) für die Bearbeitung von VERSION 3.0 UND OBEN.
Campeterson
4
Gibt es eine schnelle Möglichkeit, alle Felder einzuschließen, anstatt sie zu benennen?
Kevz
53

Außerdem dürfen keine Leerzeichen zwischen durch Kommas getrennten Feldnamen stehen.

SCHLECHT: -f firstname, lastname

GUT: -f firstname,lastname

murphsp1
quelle
27
mongoexport  --help
....
-f [ --fields ] arg     comma separated list of field names e.g. -f name,age
--fieldFile arg         file with fields names - 1 per line

Sie müssen es manuell angeben und wenn Sie darüber nachdenken, ist es absolut sinnvoll. MongoDB ist schemenlos; CSV hingegen hat ein festes Layout für Spalten. Ohne zu wissen, welche Felder in verschiedenen Dokumenten verwendet werden, kann der CSV-Speicherauszug nicht ausgegeben werden.

Wenn Sie ein festes Schema haben, können Sie möglicherweise ein Dokument abrufen, die Feldnamen mit einem Skript daraus abrufen und an mongoexport übergeben.

Karoly Horvath
quelle
1
Ich habe nur gesucht, ob ich die Liste der Felder aus einem Datensatz erhalten kann. dh von db.collection.finOne (). getFields (). Aber ich denke, das ist nicht die richtige Methode (getFields). Ich habe auch getKeys () ausprobiert. Andernfalls muss ich den Datensatz mit key: value hashes abrufen.
Erfolg Stha
Ich versuche das Gleiche zu tun, aber um herauszufinden, warum CSV-Dateien nicht richtig importiert werden. In meinem Fall muss es mir alles über sich selbst erzählen, einschließlich der Felder, die es selbst "erfunden" hat. In meinem Fall ist es also nicht sinnvoll, die Felder angeben zu müssen, da ich nicht weiß, was sie alle sind!
Stephen
Auf der Vorderseite des Feldsammel-Skripts habe ich dies vor ungefähr einem Jahr gepostet und Ihnen vielleicht ein paar Ideen gegeben.
arober11
9

Wenn Sie möchten, können Sie alle Sammlungen ohne Angabe von Informationen in csv --fieldsexportieren (exportiert alle Felder).

Von http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ diesen Bash - Skript ausführen

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=DBNAME
user=USERNAME
pass=PASSWORD
host=HOSTNAME:PORT

# first get all collections in the database
collections=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();db.getCollectionNames();"`;
collections=`mongo $dbname --eval "rs.slaveOk();db.getCollectionNames();"`;
collectionArray=($collections);

# for each collection
for ((i=0; i<${#collectionArray[@]}; ++i));
do
    echo 'exporting collection' ${collectionArray[$i]}
    # get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
    keys=`mongo "$host/$dbname" -u $user -p $pass --eval "rs.slaveOk();var keys = []; for(var key in db.${collectionArray[$i]}.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
    # now use mongoexport with the set of keys to export the collection to csv
    mongoexport --host $host -u $user -p $pass -d $dbname -c ${collectionArray[$i]} --fields "$keys" --csv --out $dbname.${collectionArray[$i]}.csv;
done

IFS=$OIFS;
Michael
quelle
4
Das einzige Problem mit dem obigen Skript besteht darin, dass davon ausgegangen wird, dass das erste Dokument in jeder Sammlung alle möglichen Schlüssel enthält, die in einem Dokument in dieser Sammlung erscheinen könnten. Dies ist möglicherweise nicht der Fall, wenn der Dokumenttyp ein Array oder ein verschachteltes Unterdokument enthalten kann.
arober11
@ arober11 Sie haben Recht, vergessen, diese wichtige Tatsache zu erwähnen. Was ich normalerweise mache, ist ein Skript zur Kartenreduzierung auszuführen , um alle Schlüssel regelmäßig zu sammeln und damit alle Schlüssel zu ziehen
Michael
3

Ich konnte Mongoexport nicht dazu bringen, dies für mich zu tun. Ich habe festgestellt, dass Sie die gesamte Sammlung einmal durchlaufen müssen, um eine vollständige Liste aller Felder zu erhalten. Verwenden Sie diese Option, um die Header zu generieren. Durchlaufen Sie dann die Sammlung erneut, um diese Überschriften für jedes Dokument zu füllen.

Ich habe ein Skript geschrieben, um genau das zu tun. Konvertieren von MongoDB-Dokumenten in CSV unabhängig von Schemaunterschieden zwischen einzelnen Dokumenten.

https://github.com/surya-shodan/mongoexportcsv

Suryakumar Sudar
quelle
2

Auch wenn Sie innere JSON-Felder exportieren möchten, verwenden Sie den Punkt (. -Operator).

JSON-Datensatz:

{
    "_id" : "00118685076F2C77",
    "value" : {
        "userIds" : [ 
            "u1"
        ],
        "deviceId" : "dev"
}

mongoexport-Befehl mit Punktoperator (mit mongo Version 3.4.7):

./mongoexport --host localhost --db myDB --collection myColl --type = csv --out out.csv --fields value.deviceId, value.userIds

Ausgabe csv:

value.deviceId,value.userIds
d1,"[""u1""]"
d2,"[""u2""]"

Hinweis: Stellen Sie sicher, dass Sie kein Array exportieren. Es würde das CSV-Format wie die oben gezeigten Feldbenutzer-IDs beschädigen

Lokendra Chauhan
quelle
0

Lösung für MongoDB Atlas Benutzer!

Fügen Sie den --fieldsParameter als durch Kommas getrennte Feldnamen hinzu, die in doppelte invertierte Anführungszeichen eingeschlossen sind:

--fields "<FIELD 1>,<FIELD 2>..."

Dies ist ein vollständiges Beispiel:

mongoexport --host Cluster0-shard-0/shard1URL.mongodb.net:27017,shard2URL.mongodb.net:27017,shard3URL.mongodb.net:27017 --ssl --username <USERNAME> --password <PASSWORD> --authenticationDatabase admin --db <DB NAME> --collection <COLLECTION NAME> --type <OUTPUT FILE TYPE> --out <OUTPUT FILE NAME> --fields "<FIELD 1>,<FIELD 2>..."
Zameer
quelle
-1

Das funktioniert bei mir Probieren Sie es aus

mongoexport --host cluster0-shard-dummy-link.mongodb.net:27017 --db yourdbname --forceTableScan   --collection users --type json --out /var/www/html/user.json --authenticationDatabase admin --ssl --username Yourusername --password Yourpassword

Über cmd werden ganze Daten der Benutzersammlung zurückgegeben. Wenn Sie ein Filterfeld wünschen, fügen Sie --fields = email, name hinzu

Manoj Patel
quelle
Wie unterscheidet sich das von den Antworten unten?
Daniel W.
mongodump --host cluster0-shard.mongodb.net:27017 --db dbname --forceTableScan --out / var / www / html / documents / db-12-2020 --authenticationDatabase admin --ssl --username youruname - Passwort Ihr Passwort Sie können dies versuchen, auch dies gibt Ihnen ganze Sammlungen.
Manoj Patel
-2

Der folgende Befehl wird zum Exportieren der Sammlung in das CSV-Format verwendet.

Hinweis: naagIst employee1_jsoneine Datenbank, ist eine Sammlung.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Naag
quelle
Dies ist, was Mongodb 4 zurückgibt: Fehlgeschlagen: CSV-Modus erfordert eine
Feldliste
-2

Für alle, die mit einem Fehler feststecken.

Lassen Sie mich Ihnen eine Lösung mit einer kurzen Erklärung derselben geben:

Befehl zum Verbinden: -

mongoexport --host your_host --port your_port -u your_username -p your_password --db your_db --collection your_collection --type=csv --out file_name.csv --fields all_the_fields --authenticationDatabase admin

--host -> Host des Mongo-Servers

--port -> Port des Mongo-Servers

-u -> Benutzername

-p -> Passwort

--db -> db, aus der Sie exportieren möchten

--collection -> Sammlung, die Sie exportieren möchten

--type -> Art des Exports in meinem Fall CSV

--out -> Dateiname, in den Sie exportieren möchten

--fields -> alle Felder, die Sie exportieren möchten (bei CSV keine Leerzeichen zwischen zwei Feldnamen zwischen Kommas angeben)

--authenticationDatabase -> Datenbank, in der alle Ihre Benutzerinformationen gespeichert sind

Officialrahulmandal
quelle