¿Cómo exportar la colección a CSV en MongoDB?

100

¿Cómo exporta todos los registros de una colección de MongoDB a un .csvarchivo?

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

Esto me pide que especifique el nombre de los campos que necesito exportar. ¿Puedo exportar todos los campos sin especificar los nombres de los campos?

Éxito Stha
fuente

Respuestas:

114

@ karoly-horvath tiene razón. Los campos son obligatorios para csv.

De acuerdo con este error en el rastreador de problemas de MongoDB https://jira.mongodb.org/browse/SERVER-4224 , DEBE proporcionar los campos al exportar a un csv . Los documentos no lo tienen claro. Ésa es la razón del error.

Prueba esto:

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

ACTUALIZAR:

Esta confirmación: https://github.com/mongodb/mongo-tools/commit/586c00ef09c32c77907bd20d722049ed23065398 corrige los documentos para 3.0.0-rc10 y versiones posteriores. Cambia

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

a

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

VERSIÓN 3.0 Y SUPERIORES:

Debería utilizarlo en --type=csvlugar de, --csvya que ha quedado obsoleto.

Más detalles: https://docs.mongodb.com/manual/reference/program/mongoexport/#export-in-csv-format

Mando completo:

mongoexport --host localhost --db dbname --collection name --type=csv --out text.csv --fields firstName,middleName,lastName
campeterson
fuente
16
A partir de la versión 3.0.6 mongoexportdicecsv flag is deprecated; please use --type=csv instead
Roman Dibikhin
Gracias (a anónimo) por la VERSIÓN 3.0 Y ARRIBA editar.
campeterson
4
¿Existe una forma rápida de incluir todos los campos en lugar de nombrar cada uno?
Kevz
53

Además, no se permiten espacios entre los nombres de campo separados por comas.

MALO: -f firstname, lastname

BUENO: -f firstname,lastname

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

Tienes que especificarlo manualmente y si lo piensas, tiene mucho sentido. MongoDB no tiene esquema; CSV, por otro lado, tiene un diseño fijo para columnas. Sin saber qué campos se utilizan en diferentes documentos, es imposible generar el volcado CSV.

Si tiene un esquema fijo, tal vez pueda recuperar un documento, recopilar los nombres de campo de él con un script y pasarlo a mongoexport.

Karoly Horvath
fuente
1
Solo estaba buscando si podía obtener la lista de campos del registro a. es decir, de db.collection.finOne (). getFields (). Pero supongo que ese no es el método correcto (getFields). Intenté getKeys () también. De lo contrario, tendré que obtener el registro con key: value hashes.
Succeed Stha
Estoy tratando de hacer lo mismo, pero para averiguar por qué no se importan los archivos csv correctamente. En mi caso, necesito que me cuente todo sobre sí mismo, incluidos los campos que "inventó" por sí mismo. Entonces, en mi caso, no tiene mucho sentido tener que especificar los campos, ¡porque no sé cuáles son todos!
Stephen
En el frente del guión de cosecha en el campo, publiqué esto hace un año o así, puede darle algunas ideas.
arober11
9

Si lo desea, puede exportar todas las colecciones a csv sin especificar --fields(exportará todos los campos).

Desde http://drzon.net/export-mongodb-collections-to-csv-without-specifying-fields/ ejecute este 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;
Miguel
fuente
4
El único problema con el script anterior es que asume que el primer documento de cada colección contiene todas las claves posibles que podrían aparecer en un documento de esa colección; lo que puede no ser el caso si el tipo de documento puede contener una matriz o un subdocumento anidado.
arober11
@ arober11 tiene razón, olvidó mencionar este hecho importante. Lo que suelo hacer es ejecutar un script de reducción de mapas para recopilar todas las claves periódicamente y usarlo para extraer todas las claves
Michael
3

No pude conseguir que mongoexport hiciera esto por mí. Descubrí que, para obtener una lista exhaustiva de todos los campos, es necesario recorrer toda la colección una vez. Use esto para generar los encabezados. Luego, recorre la colección nuevamente para completar estos encabezados para cada documento.

Escribí un guión para hacer precisamente esto. Conversión de documentos de MongoDB a csv independientemente de las diferencias de esquema entre documentos individuales.

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

Suryakumar Sudar
fuente
2

Además, si desea exportar campos json internos, use el punto (operador.).

Registro JSON:

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

Comando mongoexport con operador de punto (usando mongo versión 3.4.7):

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

Salida csv:

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

Nota: asegúrese de no exportar una matriz. Corrompería el formato CSV como el campo userIds que se muestra arriba

Lokendra Chauhan
fuente
0

¡Solución para usuarios de MongoDB Atlas!

Agregue el --fieldsparámetro como nombres de campo separados por comas encerrados entre comillas dobles invertidas:

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

Este es un ejemplo completo:

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
fuente
0

Esto funciona para mí Pruébalo

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

Por encima de cmd, devuelva los datos completos de la colección de usuarios si desea un campo de filtro y luego agregue --fields = email, name

manoj patel
fuente
¿En qué se diferencia esto de las respuestas a continuación?
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 - contraseña su contraseña puede probar esto también esto le da colecciones completas.
manoj patel
0

funciona para mí de forma remota a un contenedor docker con 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
usuario739313
fuente
-1

Para todos aquellos que están atrapados en un error.

Permítanme darles una solución con una breve explicación de la misma:

comando para conectar: ​​-

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 del servidor Mongo

--port -> puerto del servidor Mongo

-u -> nombre de usuario

-p -> contraseña

--db -> db desde el que desea exportar

--colección -> colección que desea exportar

--type -> tipo de exportación en mi caso CSV

--out -> nombre del archivo donde desea exportar

--fields -> todos los campos que desea exportar (no deje espacios entre el nombre de dos campos entre comas en caso de CSV)

--authenticationDatabase -> base de datos donde se almacena toda la información de su usuario

oficialrahulmandal
fuente
-2

El siguiente comando se usa para exportar la colección a formato CSV.

Nota: naages una base de datos, employee1_jsones una colección.

mongoexport --db naag--collection employee1_json --type csv --out /home/orienit/work/mongodb/employee1_csv_op1
Naag
fuente
esto es lo que devuelve mongodb 4: Falló: el modo CSV requiere una lista de campos
VIERNES