mongoexport聚合导出到csv文件

时间:2013-05-09 18:28:15

标签: mongodb mongoexport

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

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

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

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

7 个答案:

答案 0 :(得分:67)

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()

答案 1 :(得分:44)

您可以使用以下3个步骤导出到CSV文件:

  1. 将汇总结果分配给变量(reference):

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

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

    mongoexport -d yourdbname -c bar -f _id,total --csv > results.csv
    
  4. ......你已经完成了:)

答案 2 :(得分:12)

您无法通过mongoexport运行aggregate()次查询。 mongoexport工具旨在通过查询过滤器进行更基本的数据导出,而不是完全聚合和数据处理。不过,您可以使用您最喜欢的language driver为MongoDB轻松编写一个简短的脚本。

答案 3 :(得分:12)

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

答案 4 :(得分:2)

采取以下措施并将其保存在某个地方的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();

答案 5 :(得分:2)

按照我的逻辑,我希望将输出作为JSON数据输出到 out.json

1-在本地而不是在服务器上创建 file.js

dfs

2-运行

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

3-删除标题并检查 out.json

mongo server/collection file.js > out.json --quiet

答案 6 :(得分: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