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