Comment exporter une collection au format CSV dans MongoDB?

100

Comment exporter tous les enregistrements d'une collection MongoDB vers un .csvfichier?

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?

Réussir Stha
la source

Réponses:

114

@ karoly-horvath a raison. Les champs sont obligatoires pour csv.

Selon ce bogue dans le suivi des problèmes MongoDB https://jira.mongodb.org/browse/SERVER-4224, vous DEVEZ fournir les champs lors de l'exportation vers un csv . Les documents ne sont pas clairs à ce sujet. Telle 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:

Ce commit: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 corrige la documentation pour 3.0.0-rc10 et versions ultérieures. Ç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 SUPÉRIEURE:

Vous devez utiliser à la --type=csvplace de --csvcar 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
Campeterson
la source
16
À partir de la version 3.0.6 mongoexportditcsv flag is deprecated; please use --type=csv instead
Roman Dibikhin
Merci (à anonyme) pour l'édition de VERSION 3.0 ET SUPÉRIEURE.
campeterson le
4
existe-t-il un moyen rapide d'inclure tous les champs au lieu de les nommer chacun?
Kevz
53

De plus, vous n'êtes pas autorisé à utiliser des espaces entre les noms de champs séparés par des virgules.

MAUVAIS: -f firstname, lastname

BIEN: -f firstname,lastname

murphsp1
la source
28
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 sans schéma; CSV, en revanche, a une disposition fixe pour les colonnes. Sans savoir quels champs sont utilisés dans différents documents, il est impossible de sortir 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.

Karoly Horvath
la source
1
Je cherchais juste si je pouvais obtenir la liste des champs à partir d'un enregistrement. c'est-à-dire depuis db.collection.finOne (). getFields (). Mais je suppose que ce n'est pas la bonne méthode (getFields). J'ai également essayé getKeys (). Sinon, je devrai obtenir l'enregistrement avec des hachages clé: valeur.
Réussir le
J'essaie de faire la même chose, mais pour comprendre pourquoi il n'importe pas correctement les fichiers csv. Dans mon cas, j'en ai besoin pour tout me dire sur lui-même, y compris les domaines qu'il a «inventés» par lui-même. Donc, dans mon cas, cela n'a pas de sens d'avoir à spécifier les champs, car je ne sais pas ce qu'ils sont tous!
Stephen
Sur le front du script de récolte sur le terrain, j'ai posté ceci il y a environ un an, cela peut vous donner quelques idées.
arober11
9

Si vous le souhaitez, vous pouvez exporter toutes les collections vers csv sans spécifier --fields(exportera tous les champs).

Depuis http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/, exécutez ce 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;
Michael
la source
4
Le seul problème avec le script ci-dessus est qu'il suppose que le premier document de chaque collection contient toutes les clés possibles qui pourraient apparaître dans un document de cette collection; ce qui peut ne pas être le cas si le type de document peut contenir un tableau ou un sous-document imbriqué.
arober11
@ arober11 vous avez raison, j'ai oublié de mentionner ce fait important. Ce que je fais habituellement, c'est exécuter un script de réduction de carte pour collecter périodiquement toutes les clés et l'utiliser pour tirer toutes les clés
Michael
3

Je n'ai pas pu demander à mongoexport de faire ça à ma place. J'ai trouvé que, pour obtenir une liste exhaustive de tous les champs, vous devez parcourir une fois la collection entière. Utilisez ceci pour générer les en-têtes. Ensuite, parcourez à nouveau la collection pour remplir ces en-têtes pour chaque document.

J'ai écrit un script pour faire exactement 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

Suryakumar Sudar
la source
2

De plus, si vous souhaitez exporter des champs JSON internes, utilisez le point (opérateur.).

Enregistrement JSON:

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

Commande mongoexport avec opérateur point (utilisant 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 une matrice. Cela corromprait le format CSV comme le champ userIds indiqué ci-dessus

Lokendra Chauhan
la source
0

Solution pour les utilisateurs de MongoDB Atlas!

Ajoutez le --fieldsparamètre sous forme de noms de champs séparés par des virgules entre guillemets inversés doubles:

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

Ceci est un exemple complet:

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 Ansari
la source
0

Cela fonctionne pour moi Essayez-le

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

Au-dessus de cmd, retournez toutes les données de la collection des utilisateurs si vous voulez un champ de filtre, puis ajoutez --fields = email, nom

manoj patel
la source
En quoi est-ce différent des réponses ci-dessous?
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 - mot de passe votre mot de passe vous pouvez essayer ceci aussi cela vous donne des collections entières.
manoj patel
0

fonctionne pour moi à distance vers un conteneur docker avec mongo: 4.2.6

mongoexport -h mongodb:27017 --authenticationDatabase=admin -u username -p password -d database -c collection -q {"created_date": { "$gte": { "$date": "2020-08-03T00:00:00.000Z" }, "$lt": { "$date": "2020-08-09T23:59:59.999Z" } } } --fields=somefield1,somefield2 --type=csv --out=/archive.csv
user739313
la source
-1

Pour tous ceux qui sont coincés avec une erreur.

Permettez-moi de vous donner une solution avec une brève explication de la même chose: -

commande pour se connecter: -

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 -> hôte du serveur Mongo

--port -> port du serveur Mongo

-u -> nom d'utilisateur

-p -> mot de passe

--db -> db à partir de laquelle vous souhaitez exporter

--collection -> collection que vous souhaitez exporter

--type -> type d'export dans mon cas CSV

--out -> nom du fichier où vous souhaitez exporter

--fields -> tous les champs que vous souhaitez exporter (ne donnez pas d'espaces entre deux noms de champ entre les virgules en cas de CSV)

--authenticationDatabase -> base de données où toutes vos informations utilisateur sont stockées

officielrahulmandal
la source
-2

Commande ci-dessous utilisée pour exporter la collection au format CSV.

Remarque: naagest une base de données, employee1_jsonest une collection.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Naag
la source
voici ce que mongodb 4 retourne: Échec: le mode CSV nécessite une liste de champs
VENDREDI