web-dev-qa-db-fra.com

Comment exporter une collection au format CSV dans MongoDB?

Comment exporter tous les enregistrements d'une collection MongoDB dans un fichier .csv?

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

Cela me demande de spécifier le nom des champs que je dois exporter. Puis-je simplement exporter tous les champs sans spécifier les noms des champs?

76
Succeed Stha

@ Karoly-Horvath a raison. Les champs sont obligatoires pour CSV.

Selon ce bogue dans le suivi des problèmes de MongoDB https://jira.mongodb.org/browse/SERVER-4224, vous DEVEZ fournir les champs lors de l’exportation vers un fichier csv. Les documents ne sont pas clairs à ce sujet. C'est la raison de l'erreur.

Essaye ça:

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

METTRE À JOUR:

This commit: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 corrige les documents pour la version 3.0.0-rc10 et ultérieure. Ça change

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

à

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 ET AU-DESSUS:

Vous devez utiliser ---type=csv au lieu de --csv car il est obsolète.

Plus de détails: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Commande complète:

mongoexport --Host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
84
campeterson

En outre, les espaces entre les noms de champs séparés par des virgules ne sont pas autorisés.

MAUVAIS: -f firstname, lastname

BON: -f firstname,lastname

47
murphsp1
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

Vous devez le spécifier manuellement et si vous y réfléchissez, c'est parfaitement logique. MongoDB est schemaless; CSV, en revanche, a une disposition fixe pour les colonnes. Sans connaître les champs utilisés dans différents documents, il est impossible de générer le vidage CSV.

Si vous avez un schéma fixe, vous pourriez peut-être récupérer un document, en récolter les noms de champs avec un script et le transmettre à mongoexport.

25
Karoly Horvath

Si vous le souhaitez, vous pouvez exporter toutes les collections au format csv sans spécifier --fields (tous les champs seront exportés).

De http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ run this script bash

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;
8
Michael

Je ne pouvais pas demander à mongoexport de le faire pour moi. J'ai trouvé que, pour obtenir une liste exhaustive de tous les champs, vous devez parcourir la collection entière une fois. Utilisez ceci pour générer les en-têtes. Puis parcourez à nouveau la collection pour renseigner ces en-têtes pour chaque document.

J'ai écrit un script pour faire cela. Conversion de documents MongoDB en csv indépendamment des différences de schéma entre les documents individuels.

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

2
Suryakumar Sudar

La commande ci-dessous permet d'exporter la collection au format CSV.

Remarque: naag est une base de données, employee1_json est une collection.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
0
Naag

De plus, si vous souhaitez exporter des champs JSON internes, utilisez la commande point (. Opérateur). 

Enregistrement JSON:

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

Commande mongoexport avec opérateur point (avec mongo version 3.4.7):

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

Sortie csv:

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

Remarque: Assurez-vous de ne pas exporter de tableau. Cela corromprait le format CSV comme les champs userIds indiqués ci-dessus  

0
Lokendra Chauhan