Перенаправление вывода запроса mongo в файл csv
Я использую MongoDB 2.2.2 для 32-разрядной машины Windows7. У меня есть сложный запрос агрегации в .js файл. Мне нужно выполнить этот файл в оболочке и направить вывод в файл CSV. Я гарантирую, что запрос возвращает "плоский" json (без вложенных ключей), поэтому он по своей сути преобразуется в аккуратный csv.
Я знаю о load()
и eval()
. eval()
требует от меня, чтобы вставить весь запрос в оболочку и позволяет только printjson()
внутри скрипта, в то время как мне нужен csv. И, второе путь:load()
..он печатает вывод на экране, и снова в формате json.
Есть ли способ Монго сделать это преобразование из json в csv? (Мне нужен csv-файл для подготовки диаграмм по данным). Я думаю:
1. Либо у монго есть встроенная команда для этого, которую я не могу найти прямо сейчас.
2. Монго не может сделать это за меня; я могу в лучшем случае отправить вывод json в файл, который мне затем нужно преобразовать в csv самостоятельно.
3. Mongo может отправить вывод json во временный коллекция, содержание которой может быть легко mongoexported
в формат csv. Но я думаю, что только map-reduce запросы поддерживают выходные коллекции. Это правда? Мне это нужно для запроса агрегации.
Спасибо за любую помощь :)
5 ответов:
Я знаю, что этот вопрос старый, но я потратил час, пытаясь экспортировать сложный запрос в csv, и я хотел поделиться своими мыслями. Сначала я не мог заставить работать ни один из конвертеров json в csv (хотя этой один выглядел многообещающе). То, что я в конечном итоге сделал, это вручную написать csv-файл в моем сценарии mongo.
Это простая версия, но по существу то, что я сделал:
print("name,id,email"); db.User.find().forEach(function(user){ print(user.name+","+user._id.valueOf()+","+user.email); });
Это я просто передал запрос в stdout
mongo test export.js > out.csv
где
test
- это имя базы данных, которую я использую.
встроенный экспорт Mongo работает нормально, если вы не хотите каких-либо манипуляций с данными, таких как дата формата, скрытые типы данных и т. д.
следующая команда работает как шарм.
mongoexport -h localhost -d databse -c collection --csv --fields erpNum,orderId,time,status -q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' --out report.csv
посмотреть этой
для вывода из оболочки mongo в файл. Нет поддержки для вывода csv из оболочки mongos. Вам придется написать javascript самостоятельно или использовать один из многих доступных конвертеров. Например, Google "конвертировать json в csv".
вот что вы можете попробовать:
print("id,name,startDate") cursor = db.<collection_name>.find(); while (cursor.hasNext()) { jsonObject = cursor.next(); print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"") }
сохраните это в файле, скажем " экспорт.js". Выполните следующую команду:
mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv
расширение других ответов:
я нашел ответ @GEverding наиболее гибким. Он также работает с агрегацией:
test_db.js
print("name,email"); db.users.aggregate([ { $match: {} } ]).forEach(function(user) { print(user.name+","+user.email); } });
выполните следующую команду для экспорта результатов:
mongo test_db < ./test_db.js >> ./test_db.csv
к сожалению, это добавляет дополнительный текст в файл CSV, который требует обработки файла, прежде чем мы сможем его использовать:
MongoDB shell version: 3.2.10 connecting to: test_db
но мы можем заставить Mongo shell прекратить выплевывать эти комментарии и печатать только то, что мы попросили, передав
--quiet
флагmongo --quiet test_db < ./test_db.js >> ./test_db.csv