Перенаправление вывода запроса 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 59

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