从MongoDB到CSV的JSON,然后转置行

时间:2016-11-03 17:09:38

标签: json mongodb postgresql csv relational-database

我有一些看起来像这样的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 个答案:

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

所以你可以写这样的输出文件(在像操作系统这样的unix上)

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