Redirigir la salida de la consulta mongo a un archivo csv


Estoy usando MongoDB 2.2.2 para la máquina Windows7 de 32 bits. Tengo una consulta de agregación compleja en a .archivo js. Necesito ejecutar este archivo en el shell y dirigir la salida a un archivo CSV. Me aseguro de que la consulta devuelva un json "plano" (sin claves anidadas), por lo que es inherentemente convertible a un csv limpio.

Sé acerca de load() y eval(). eval() requiere que pegue toda la consulta en el shell y solo permite printjson() dentro del script, mientras que necesito csv. Y, la segunda manera: load() prints Imprime la salida en la pantalla, y de nuevo en formato json.

¿Hay alguna forma de que Mongo pueda hacer esta conversión de json a csv? (Necesito un archivo csv para preparar gráficos sobre los datos). Estoy pensando:

1. O Mongo tiene un comando incorporado para esto que no puedo encontrar en este momento.
2. Mongo no puede hacerlo por mí; a lo sumo puedo enviar la salida json a un archivo que luego necesito convertir a csv yo mismo.
3. Mongo puede enviar la salida json a una colección temporal, cuyo contenido puede ser fácilmente mongoexported a formato csv. Pero creo que solo las consultas de map-reduce admiten colecciones de salida. ¿Es eso cierto? Lo necesito para una consulta de agregación.

Gracias por cualquier ayuda:)

Author: Aafreen Sheikh, 2013-01-23

5 answers

Sé que esta pregunta es antigua, pero paso una hora tratando de exportar una consulta compleja a csv y quería compartir mis pensamientos. Primero no pude conseguir ninguno de los convertidores json a csv para trabajar (aunque este parecía prometedor). Lo que terminé haciendo fue escribir manualmente el archivo csv en mi script mongo.

Esta es una versión simple, pero esencialmente lo que hice:

print("name,id,email");
db.User.find().forEach(function(user){
  print(user.name+","+user._id.valueOf()+","+user.email);
});

Esto acabo de canalizar la consulta a stdout

mongo test export.js > out.csv

Donde test es el nombre de la base de datos I utilizar.

 132
Author: GEverding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 14:42:46

La exportación incorporada de Mongo está funcionando bien, a menos que desee cualquier manipulación de datos como fecha de formato, tipos de datos encubiertos, etc.

El siguiente comando funciona como charm.

mongoexport -h localhost -d databse -c collection --csv 
--fields erpNum,orderId,time,status 
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
--out report.csv
 66
Author: thisarattr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 16:39:07

Echa un vistazo a esto

Para la salida desde el shell de mongo al archivo. No hay soporte para la salida de csv desde el shell de mongos. Usted tendría que escribir el javascript usted mismo o utilizar uno de los muchos convertidores disponibles. Google "convertir json a csv", por ejemplo.

 5
Author: geakie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:28

Esto es lo que puedes probar:

print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
    jsonObject = cursor.next();
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")

}

Guarde eso en un archivo, diga "exportar.js". Ejecute el siguiente comando:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv
 5
Author: Shirish Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-17 20:13:58

Extendiendo otras respuestas:

La respuesta de @GEverding me pareció muy flexible. También funciona con agregación:

Test_db.js

print("name,email");

db.users.aggregate([
    { $match: {} }
]).forEach(function(user) {
        print(user.name+","+user.email);
    }
});

Ejecute el siguiente comando para exportar resultados:

mongo test_db < ./test_db.js >> ./test_db.csv

Desafortunadamente, agrega texto adicional al archivo CSV que requiere procesar el archivo antes de que podamos usarlo:

MongoDB shell version: 3.2.10 
connecting to: test_db

Pero podemos hacer que mongo shell deje de escupir esos comentarios y solo imprimir lo que hemos pedido pasando el --quiet pabellón

mongo --quiet test_db < ./test_db.js >> ./test_db.csv
 5
Author: Lucky Soni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-01 12:52:16