Подтвердить что ты не робот

Экспорт агрегата mongoexport в файл csv

Я хочу сохранить результат из агрегации в файл csv.

Используя инструмент mongo cmd line, я могу сделать это, чтобы получить результаты, которые я хочу:

db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}

Как бы перевести это в команду mongoexport, которая сохраняет результаты в csv?

4b9b3361

Ответ 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

Что я делаю неправильно?