59

我想将聚合结果保存到 csv 文件中。

使用 mongo cmd line 工具,我可以这样做以获得我想要的结果:

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

我如何将其转换为将结果保存到 csv 的 mongoexport 命令?

4

7 回答 7

142

从 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()
于 2014-09-19T14:52:57.073 回答
54

您可以通过以下 3 个步骤导出到 CSV 文件:

  1. 将您的聚合结果分配给一个变量(参考):

    var result = db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}
    
  2. 将变量的值插入到新集合中:

    db.bar.insert(result.toArray());
    
  3. 在终端(或命令行)中,将此条形集合导出到 CSV 文件:

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

...你就完成了:)

于 2013-10-30T01:25:25.520 回答
23

不能通过mongoexport. _ 该mongoexport工具旨在通过查询过滤器而不是完全聚合和数据处理来导出更基本的数据。不过,您可以使用您最喜欢的 MongoDB语言驱动程序轻松编写一个简短的脚本。

于 2013-05-11T01:45:44.650 回答
17

如果您不想将结果存储在集合中,也可以使用 print 函数从 JavaScript 直接写入 CSV 文件。将以下脚本保存到 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 循环。

于 2014-09-05T22:45:24.017 回答
5

采取以下并将其保存在某处的mongo服务器上:

// 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);
    }
}

然后,您可以通过 shell 或 Robomongo 等 GUI 运行以下命令:

load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();
于 2018-02-22T13:42:46.810 回答
2

按照同样的逻辑,在我的例子中,我希望将输出作为 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-删除标头并签出.json

[
  {
    "_id": "124564789",
    "xyz": [
      {
        "name": "x",
        "value": "1"
      },
      {
        "name": "y",
        "value": "2"
      }
    ],
    "name": "LOL",
    "user": {
      "email": "LOL@LOL.com"
    }
  },
....
....
}]
于 2019-09-10T18:19:59.467 回答
0

试试这个查询 -

mongoexport -d DataBase_Name -c Collection_Name --type=csv --fields name,phone,email -q '{_bank:true,"bank.ifsc":{$regex:/YESB/i}}' --out report.csv
于 2020-03-09T10:56:45.380 回答