Общий экспорт mongoexport в файл csv

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

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

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

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


person Baconator507    schedule 09.05.2013    source источник
comment
К вашему сведению, mongoexport имеет параметр --query, но он не поддерживает такие сложные запросы, как ваш.   -  person alecxe    schedule 09.05.2013
comment
так никак нельзя сделать?   -  person Baconator507    schedule 10.05.2013
comment
не могли бы вы решить эту проблему?   -  person babeyh    schedule 15.11.2019


Ответы (7)


Вы не можете выполнять запросы aggregate() через mongoexport. Инструмент mongoexport предназначен для более простого экспорта данных с фильтром запроса, а не для полной агрегации и обработки данных. Однако вы можете легко написать короткий скрипт, используя ваш любимый драйвер языка для MongoDB.

person Stennie    schedule 11.05.2013

Немного более простой вариант начиная с версии 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()
person Matt    schedule 19.09.2014
comment
Я попробовал это из Robo 3T, и это не удалось. Однако при непосредственном использовании оболочки mongo это было похоже на чудесную магию. - person Dror; 22.03.2019
comment
Это стоит всех усилий без использования клиента. Но затем я столкнулся со странной проблемой при использовании этого запроса - Совокупный запрос Mongo приводит к меньшему количеству документов с сортировкой, что, я сомневаюсь, не было бы в случае с клиентом. (Хотя я не совсем уверен в правильности сравнения.) - person Naman; 28.03.2020

Вы можете экспортировать в файл CSV, выполнив следующие 3 шага:

  1. Назначьте результаты агрегирования переменной (ссылка):

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
    
  2. Вставьте значение переменной в новую коллекцию:

    db.bar.insert(result.result);
    
  3. В терминале (или в командной строке) экспортируйте эту коллекцию bar в файл CSV:

    mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv
    

...и вы сделали :)

person Askar    schedule 30.10.2013
comment
Шаги 1 и 2 можно комбинировать, начиная с MongoDB 2.6, используя оператор $out для агрегата. См. stackoverflow.com/questions/13612028/. - person Philippe; 23.01.2015
comment
Это действительно полезно для тех, кто все еще использует 2.4 на своих серверах. Проголосовал. - person user1589754; 27.02.2015
comment
Я считаю, что второй шаг должен быть db.bar.insert(result.toArray()); - person Rolf Thunbo; 19.06.2015

Если вы не хотите сохранять результаты в коллекции, вы также можете напрямую писать в CSV-файл из JavaScript, используя функцию печати. Сохраните следующий скрипт в файл, например exportCompras.js.

let cursor = db.compras.aggregate({ $group : 
  { _id : "$data.proponente", 
    total : { $sum : "$price" }
  }
});

if (cursor && cursor.hasNext()) {

  //header
  print('proponente,total');

  cursor.forEach(item => {
    print('"' + item._id + '",' + item.total);
    // printjson(item); -- if you need JSON
  });
}

В командной строке вызовите ›mongo server/collection exportCompras.js › comprasResults.csv --quiet

Обновлено из комментария @M.Justin, чтобы заменить предыдущий цикл while.

person What Would Be Cool    schedule 05.09.2014
comment
Это можно упростить, используя .forEach вместо того, чтобы вручную перебирать курсор: cursor.forEach(item => print('"' + item._id + '",' + item.total)); - person M. Justin; 26.02.2020
comment
Для текущего кода просто нужен ) после блока forEach выше - person Christopher G; 29.07.2020

Возьмите следующее и сохраните его где-нибудь на сервере монго:

// 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();
person Ian Newson    schedule 22.02.2018

По той же логике в моем случае я хочу, чтобы выходные данные в виде данных 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]"
    }
  },
....
....
}]
person HMagdy    schedule 10.09.2019

Попробуйте это для запроса

mongoexport -d DataBase_Name -c Collection_Name --type=csv --fields name,phone,email -q '{_bank:true,"bank.ifsc":{$regex:/YESB/i}}' --out report.csv
person Ankit Kumar Rajpoot    schedule 09.03.2020