web-dev-qa-db-ja.com

mongoexport csvファイルへの集計エクスポート

集計の結果をcsvファイルに保存したい。

Mongo cmd lineツールを使用して、これを実行して必要な結果を取得できます。

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

これを結果をcsvに保存するmongoexportコマンドにどのように変換しますか?

35
Baconator507

mongoexportを介して aggregate() クエリを実行することはできません。 mongoexportツールは、完全な集計とデータ処理ではなく、クエリフィルターを使用したより基本的なデータエクスポートを目的としています。ただし、MongoDBの場合は、お気に入りの 言語ドライバー を使用して短いスクリプトを簡単に作成できます。

12
Stennie

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

次の3つの手順でCSVファイルにエクスポートできます。

  1. 集計結果を変数に割り当てます( reference ):

    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
    

...これで完了です:)

44
Askar

結果をコレクションに保存したくない場合は、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

14

以下を実行し、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);
    }
}

その後、シェルまたはRobomongoなどのGUIを介して次のコマンドを実行できます。

load('C:\\path\\to\\your\\saved\\js\\file')
db.compras.aggregate({ $group : { _id : "$data.proponente", total : { $sum : "$price" } }}.toCsv();
3
Ian Newson