Estoy usando MongoDB 2.2.2 para una máquina Windows7 de 32 bits. Tengo una consulta de agregación compleja en un 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 ordenado.
Conozco 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 forma: load()
.. Imprime la salida en la pantalla, y nuevamente 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. Cualquiera de los dos mongo tiene un comando incorporado para esto que no puedo encontrar en este momento.
2. Mongo no puede hacerlo por mí; Como máximo, 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
en formato csv. Pero creo que solo las consultas de reducción de mapas admiten colecciones de salida. ¿Está bien? Lo necesito para una consulta de agregación.
Gracias por cualquier ayuda :)
fuente
Respuestas:
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 hacer que ninguno de los convertidores json a csv funcionara (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 enviar la consulta a stdout
mongo test export.js > out.csv
donde
test
está el nombre de la base de datos que utilizo.fuente
use <database>
en la parte superior del scripttest
en el último comando está el nombre de la base de datos, simplemente reemplácelo con el nombre de su base de datos.La exportación incorporada de Mongo funciona bien, a menos que desee manipular datos como fecha de formato, tipos de datos encubiertos, etc.
Seguir el comando funciona como un encanto.
mongoexport -h localhost -d databse -c collection --type=csv --fields erpNum,orderId,time,status -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' --out report.csv
fuente
--type=csv
lugar de--csv
.Ampliando otras respuestas:
Encontré la respuesta de @ GEverding más 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:
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 imprima lo que hemos pedido pasando la
--quiet
banderafuente
Esto es lo que puede 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() +"\"") }
Guárdelo en un archivo, diga "export.js". Ejecute el siguiente comando:
fuente
Echa un vistazo a esto
para la salida de mongo shell a archivo. No hay soporte para la salida de csv desde mongos shell. Tendría que escribir el javascript usted mismo o usar uno de los muchos convertidores disponibles. Google "convierte json a csv", por ejemplo.
fuente
Solo pesando aquí con una buena solución que he estado usando. Esto es similar a la solución de Lucky Soni anterior, ya que admite la agregación, pero no requiere la codificación de los nombres de los campos.
cursor = db.<collection_name>.<my_query_with_aggregation>; headerPrinted = false; while (cursor.hasNext()) { item = cursor.next(); if (!headerPrinted) { print(Object.keys(item).join(',')); headerPrinted = true; } line = Object .keys(item) .map(function(prop) { return '"' + item[prop] + '"'; }) .join(','); print(line); }
Guarde esto como un
.js
archivo, en este caso lo llamaremosexample.js
y lo ejecutaremos con la línea de comando mongo así:fuente