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?
@ 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
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
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.
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;
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.
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
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