MapReduce:创建一个返回/数据透视表

时间:2013-11-22 04:53:38

标签: mongodb

我有以下文件:

{ "col1": "camera", "fps": "1F", "device": "Multi" },
{ "col1": "camera", "fps": "3F", "device": "Multi" }
{ "col1": "recorders", "fps": "9F", "device": "VideoPlayer" }
{ "col1": "cell", "fps": "8F", "device": "camcorder" }
{ "col1": "cell", "fps": "3F", "device": "camcorder" }
{ "col1": "phone", "fps": "3F", "device": "camcorder" }

....我正在尝试创建一个如下所示的数据透视表:

{ _id: "col1", [ { "camcorder": { "3F": 2, "8F": 1 }}, { "VideoPlayer": { "9F": 1 }}, { "Multi": { "3F":1, "1F":1" }} ] }

我正在做以下事情:

map = function() { key = "col1"; value = { this.fps: device }; print(value.foo); emit(key, value); }
reduce2 = function(key, value) { retval = {}; key = value; retval[key] = (retval[key] || 0) + 1;  return retval; }

这不是真的有效,它导致以下结果:

{ "_id" : "col1", "value" : { "[object Object],multi,videoplayer,camcorder" : 1 } }

基本上,这将是fps的总和,按设备分组。

请帮忙。

1 个答案:

答案 0 :(得分:2)

我知道我的建议并不完全是你想要的,但也许它可以帮助你。

var aggregated = db.coll.aggregate({$group: {_id:{device:"$device", fps:"$fps"
}, count: {$sum:1}}}, {$project: {device: '$_id.device', fps: '$_id.fps', count:
 '$count'}}, {$group:{_id:"$device", result:{$push:{"fps":"$fps","count":"$count
"}}}})

结果将是:

{
        "result" : [
                {
                        "_id" : "Multi",
                        "result" : [
                                {
                                        "fps" : "3F",
                                        "count" : 1
                                },
                                {
                                        "fps" : "1F",
                                        "count" : 1
                                }
                        ]
                },
                {
                        "_id" : "camcorder",
                        "result" : [
                                {
                                        "fps" : "3F",
                                        "count" : 2
                                },
                                {
                                        "fps" : "8F",
                                        "count" : 1
                                }
                        ]
                },
                {
                        "_id" : "VideoPlayer",
                        "result" : [
                                {
                                        "fps" : "9F",
                                        "count" : 1
                                }
                        ]
                }
        ],
        "ok" : 1
}

我认为合并分组文档并不难。