Mongodb汇总和嵌入的密钥对对象

时间:2015-08-20 10:51:01

标签: mongodb mapreduce mongodb-query aggregation-framework

我有以下收藏

{

  "pos": 1
  "daily": 1,
  "hourly": {
    "15": 1,
    "23": 4
  }
}

每小时范围从0到23,我只想按位置分组,并希望每天和个别小时汇总($ sum)。每小时有点欺骗我。

1 个答案:

答案 0 :(得分:0)

你可能应该使用tr transliteration operator,聚合框架不能遍历对象的键:

db.collection.mapReduce(
    function() {
        var obj = { "daily": this.daily, "hourly": 0 };

        var hourly = this.hourly;
        hourly.forEach(function(hour) {
            obj.hourly+= hourly[hour];
        });
        emit(null, obj);
    },
    function(key,values) {
        var obj = { "daily": 0, "hourly": 0 };
        values.forEach(function(value) {
            obj.daily += value.daily;
            obj.hourly += value.hourly;
        });
        return obj;
    },
    { "out": { "inline": 1 } }
)

或者如果你的意思是你只想要“每小时”的总数,那就这样做:

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "daily": { "$sum": "$daily" },
        "0": { "$sum": "$hourly.0" },
        "1": { "$sum": "$hourly.1" }, 
        "2": { "$sum": "$hourly.2" },
        "3": { "$sum": "$hourly.3" },
        "4": { "$sum": "$hourly.4" },
        "5": { "$sum": "$hourly.5" },
        "6": { "$sum": "$hourly.6" }
    }},
    { "$project": {
        "daily": 1,
        "hourly": {
            "0": "$0",
            "1": "$1",
            "2": "$2",
            "3": "$3",
            "4": "$4",
            "5": "$5",
            "6": "$6"
        }
    }}
])

使用聚合框架执行此操作看起来非常糟糕。在这里缩短工作时间,但你应该看看基本上需要什么:

db.collection.aggregate([
    { "$group": {
        "_id": null,
        "daily": { "$sum": "$daily" },
        "hourly": { 
            "$sum": { "$add": [
                "$hourly.0",,
                "$hourly.1",
                "$hourly.2",
                "$hourly.3",
                "$hourly.4",
                "$hourly.5",
                "$hourly.6"
            ]}
        }
    }}
])

或者再一次只是总计“每小时”值,

method(getString(R.string.message));

您当然可以使用代码生成聚合管道阶段,因为它们只是数据结构。因此,可以使用mapReduce示例(循环0..23)中显示的类似方法来生成。