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