Перенаправить вывод запроса mongo в файл csv
Я использую MongoDB 2.2.2 для 32-разрядной машины Windows7. У меня есть сложный запрос агрегирования в файле .js. Мне нужно выполнить этот файл в оболочке и перенаправить вывод в файл CSV. Я гарантирую, что запрос возвращает "плоский" json (без вложенных ключей), поэтому он неотъемлемо конвертируется в аккуратный csv.
Я знаю о load()
и eval()
. eval()
требует, чтобы я вложил весь запрос в оболочку и разрешил только printjson()
внутри script, тогда как мне нужен csv. И, второй способ: load()
.. Он печатает выходные данные на экране и снова в формате json.
Есть ли способ, которым Mongo может сделать это преобразование из json в csv? (Мне нужен файл csv для подготовки диаграмм по данным). Я думаю:
1. Либо mongo имеет встроенную команду для этого, которую я не могу найти прямо сейчас.
2. Монго не может сделать это для меня; Я могу в большинстве случаев отправить json файл в файл, который мне тогда нужно преобразовать в csv.
3. Mongo может отправить выход json во временную коллекцию, содержимое которой может быть легко mongoexported
в формате csv. Но я думаю, что только запросы с уменьшением количества карт поддерживают выходные коллекции. Это правильно? Мне нужно это для запроса агрегации.
Спасибо за любую помощь:)
Ответы
Ответ 1
Я знаю, что этот вопрос старый, но я трачу час, пытаясь экспортировать сложный запрос в csv, и я хотел поделиться своими мыслями. Во-первых, я не мог заставить работать какие-либо из json-csv-преобразователей (хотя этот выглядел многообещающим). То, что я закончил, - это вручную написать файл csv в моем mongo script.
Это простая версия, но в основном то, что я сделал:
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
- имя используемой базы данных.
Ответ 2
Встроенный экспорт Mongo работает нормально, если только вы не хотите манипулировать данными, такими как форматирование даты, скрытые типы данных и т.д.
Следующая команда работает как шарм.
mongoexport -h localhost -d databse -c collection --type=csv
--fields erpNum,orderId,time,status
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}'
--out report.csv
Ответ 3
Вот что вы можете попробовать:
print("id,name,startDate")
cursor = db.<collection_name>.find();
while (cursor.hasNext()) {
jsonObject = cursor.next();
print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"")
}
Сохраните это в файле, скажем, "export.js". Выполните следующую команду:
mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv
Ответ 4
Взгляните на
this
для вывода из оболочки mongo в файл.
Нет поддержки для вывода csv из оболочки mongos. Вам нужно будет написать javascript самостоятельно или использовать один из многих доступных конвертеров. Например, Google "конвертирует json в csv".
Ответ 5
Расширение других ответов:
Я нашел @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 прекратить выплескивать эти комментарии и печатать только то, что мы просили, передав флаг --quiet
mongo --quiet test_db < ./test_db.js >> ./test_db.csv
Ответ 6
Существует гораздо лучший способ перевернуть стол. Просто напишите ваши данные, которые вы хотите, в листе Excel, который можно легко сделать на любом языке, например, node.js.
Тогда вы можете легко конвертировать Excel листы в CSV Simple!