Экспорт агрегата mongoexport в файл csv
Я хочу сохранить результат из агрегации в файл csv.
Используя инструмент mongo cmd line, я могу сделать это, чтобы получить результаты, которые я хочу:
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
Как бы перевести это в команду mongoexport, которая сохраняет результаты в csv?
Ответы
Ответ 1
Вы не можете запускать aggregate() запросы через mongoexport
. Инструмент mongoexport
предназначен для более простого экспорта данных с помощью фильтра запросов, а не для полной агрегации и обработки данных. Вы можете легко написать короткий script, используя ваш любимый языковой драйвер для MongoDB.
Ответ 2
Чуть более простой вариант, начиная с версии 2.6+, теперь добавляет к вашему агрегату шаг $out, чтобы поместить результаты в коллекцию:
db.collection.aggregate( [ { aggregation steps... }, { $out : "results" } ] )
Затем просто используйте mongoexport
mongoexport -d database -c results -f field1,field2,etc --csv > results.csv
После этого вы можете удалить временную коллекцию из базы данных, чтобы она не использовала ненужные ресурсы, а также, чтобы избежать путаницы позже, когда вы забыли, почему эта коллекция существует в вашей базе данных.
db.results.drop()
Ответ 3
Вы можете экспортировать файл CSV со следующими тремя шагами:
-
Назначьте результаты своей совокупности переменной (ссылка):
var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
-
Вставьте значение переменной в новую коллекцию:
db.bar.insert(result.result);
-
В терминале (или командной строке) экспортируйте эту коллекцию bar в файл CSV:
mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv
... и все готово:)
Ответ 4
Если вы не хотите хранить результаты в коллекции, вы также можете напрямую написать CSV файл из JavaScript с помощью функции печати. Сохраните следующий script файл, такой как exportCompras.js.
var cursor = db.compras.aggregate({ $group :
{ _id : "$data.proponente",
total : { $sum : "$price" }
}
});
if (cursor && cursor.hasNext()) {
//header
print('proponente,total');
while ( cursor.hasNext() ) {
var item = cursor.next();
print('"' + item._id + '",' + item.total);
//printjson(cursor.next()); -- or if you prefer the JSON
}
}
В командной строке вызовите
mongo server/collection exportCompras.js > comprasResults.csv --quiet
Ответ 5
Возьмите следующее и сохраните его где-нибудь на сервере Монго:
// Export to CSV function
DBCommandCursor.prototype.toCsv = function(deliminator, textQualifier)
{
var count = -1;
var headers = [];
var data = {};
deliminator = deliminator == null ? ',' : deliminator;
textQualifier = textQualifier == null ? '\"' : textQualifier;
var cursor = this;
while (cursor.hasNext()) {
var array = new Array(cursor.next());
count++;
for (var index in array[0]) {
if (headers.indexOf(index) == -1) {
headers.push(index);
}
}
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
data[count + '_' + index] = array[i][index];
}
}
}
var line = '';
for (var index in headers) {
line += textQualifier + headers[index] + textQualifier + deliminator;
}
line = line.slice(0, -1);
print(line);
for (var i = 0; i < count + 1; i++) {
var line = '';
var cell = '';
for (var j = 0; j < headers.length; j++) {
cell = data[i + '_' + headers[j]];
if (cell == undefined) cell = '';
line += textQualifier + cell + textQualifier + deliminator;
}
line = line.slice(0, -1);
print(line);
}
}
Затем вы можете запустить следующие команды через оболочку или графический интерфейс, например, Robomongo:
load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();
Ответ 6
По той же логике, в моем случае, я хочу вывод в виде данных JSON в out.json
1- Создать file.js на локальном, а не на сервере
date = new Date("2019-09-01");
query = {x: true, 'created': {$gte: date}};
now = new Date();
userQuery = {'user.email': {$nin: [/\.dev$|@test\.com$|@testing\.com$/]}};
data = db.companies.aggregate([
{$match: query},
{$sort: {x: 1, created: 1}},
{$lookup: {as: 'user', from: 'users', localField: 'creator', foreignField: '_id'}},
{$addFields: {user: {$arrayElemAt: ['$user', 0]}}},
{$match: userQuery},
{$project: {"_id": 1, "name": 1, "user.email": 1, "xyz": 1}}
]).toArray();
print(JSON.stringify(data));
2- Беги
mongo server/collection file.js > out.json --quiet
3- Удалить заголовок и проверить out.json
[
{
"_id": "124564789",
"xyz": [
{
"name": "x",
"value": "1"
},
{
"name": "y",
"value": "2"
}
],
"name": "LOL",
"user": {
"email": "[email protected]"
}
},
....
....
}]
Ответ 7
Я могу использовать .toCsv() с .find(), но не могу запустить его с aggregate(), как в примере выше: db.compras.aggregate({$ group: {_id: "$ data.proponente", всего: {$ sum: "$ price"}}}. toCsv(); выдает ошибку: "TypeError:... toCsv() не является функцией. Подробности: $ (shell): 1:1
Что я делаю неправильно?