Перенаправление вывода запроса mongo в csv-файл
Я использую MongoDB 2.2.2 для 32-разрядной машины Windows7. У меня есть сложный запрос агрегации в .файл js. Мне нужно выполнить этот файл в оболочке и направить вывод в CSV-файл. Я гарантирую, что запрос возвращает "плоский" json (без вложенных ключей), поэтому он по своей сути конвертируется в аккуратный csv.
Я знаю о load()
и eval()
. eval()
требует, чтобы я вставил весь запрос в оболочку и разрешил только printjson()
внутри скрипта, в то время как мне нужен csv. И, второе путь:load()
..он печатает вывод на экране и снова в формате json.
Есть ли способ, которым Mongo может сделать это преобразование из json в csv? (Мне нужен csv-файл для подготовки диаграмм на данных). Я думаю:
1. Либо у монго есть встроенная команда для этого, которую я не могу найти прямо сейчас.
2. Mongo не может сделать это за меня; я могу, самое большее, отправить вывод json в файл, который мне нужно преобразовать в csv.
3. Mongo может отправить вывод json во временное коллекция, содержание которой может быть легко mongoexported
в формат csv. Но я думаю, что только запросы map-reduce поддерживают выходные коллекции. Это правда? Мне это нужно для запроса агрегации.
Спасибо за любую помощь :)
5 ответов
Я знаю, что этот вопрос старый, но я потратил час, пытаясь экспортировать сложный запрос в csv, и я хотел поделиться своими мыслями. Сначала я не мог заставить ни один из конвертеров JSON to 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 shell. Вам придется написать 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