2016-11-03 5 views
0

私はこのようになりますいくつかのJSONデータを持っている移調:JSONは、その後、行

[{ 
     id: "1", 
     quantity: "3", 
     date: "2016-10-31T02:35:37.587Z" 
    }, { 
     id: "2", 
     quantity: "5", 
     date: "2016-10-31T02:35:37.587Z" 
    }, { 
     id: "1", 
     quantity: "4", 
     date: "2016-11-01T03:42:22.711Z" 
    }, { 
     id: "2", 
     quantity: "0", 
     date: "2016-11-01T03:42:22.711Z" 
    }, { 
     ... 

をJSONには、MongoDBのデータベースから出てきています。私は簡単に以下のCSVファイルにそれをダンプすることができます。

id | quantity | date 
------------------------------------------------------------------ 
1 |  3  |  2016-10-31T02:35:37.587Z 
2 |  5  |  2016-10-31T02:35:37.587Z 
1 |  4  |  2016-11-01T03:42:22.711Z 
2 |  0  |  2016-11-01T03:42:22.711Z 

しかし、私が本当にしたいことは、このようになります。表形式のデータである。この最後のテーブルを達成するためにどのように

id | 2016-10-31T02:35:37.587Z | 2016-11-01T03:42:22.711Z 
------------------------------------------------------------------ 
1 |    3    |    4 
2 |    5    |    0 

任意のアイデア? PostgreSQLを使用してMongoDBやダンプされたcsvファイルの操作を行うことができます(クロス集計を試しましたが、動作させることはできませんでした)。

これは600k行の大きなデータセットであることに注意してください。

答えて

1

小さなjsスクリプトでこれを行うことができます。それはあなたが提供したデータと一緒に動作しますが、それを「すぐに使える」ようにするには、IDごとに異なる日付を持つことを確認する必要があります。ただし、そうでない場合は、簡単にスクリプトを変更できます。

script.js:(タブ区切りのcvsを生成しますが、あなたが好きに変更することができます)

// aggregation query, group by id and push other fiels in an array 
var cursor = db.collection.aggregate([ 
      {$group: 
      { _id: "$id", 
       date: {$push: "$date"}, 
       quantity: {$push: "$quantity"} 
      } 
      }]) 

// after this cursor content looks like 
// { "_id" : "2", "date" : [ "2016-10-31T02:35:37.587Z", "2016-11-01T03:42:22.711Z" ], "quantity" : [ "5", "0" ] } 
// { "_id" : "1", "date" : [ "2016-10-31T02:35:37.587Z", "2016-11-01T03:42:22.711Z" ], "quantity" : [ "3", "4" ] } 


var item; 
var headers; 
var content; 
var nb = -1; 

// iterate over the results 
while (cursor && cursor.hasNext()){ 
    item = cursor.next(); 
    // print headers 
    if (nb<0){ 
    headers = 'id'; 
     for (var i =0; i<item.date.length; i++) { 
     headers += '\t' + item.date[i]; 
     } 
    print(headers); 
    nb++; 
    } 
    // print content 
    content = item._id; 
    for (var j=0; j<item.quantity.length; j++){ 
    content += '\t' + item.quantity[j]; 
    } 
    print('\n' +content); 
} 

は、このコマンドを入力し、それを使用する:

mongo dbName --quiet < script.js 

これが印刷されます

id 2016-10-31T02:35:37.587Z 2016-11-01T03:42:22.711Z 

2 5 0 

1 3 4 

出力ファイルに次のように書き込むことができます。これは(OSのようなUNIX上で)

mongo dbName --quiet <script.js> output.csv 
+0

完璧に動作します。 .csvファイルに空の行を追加していたので、2行目から最後の行で '\ n 'を削除しました。 – bplmp