mongodb:将每小时数据汇总到两小时聚合

时间:2014-09-22 07:45:31

标签: mongodb mongodb-query aggregation-framework

我在mongodb有一个小时报告,每小时都有一些数据。现在我希望从它获得两小时的报告,这意味着每两个小时它将具有字段“计数”和“值”的总和。怎么做聚合?非常感谢!

之前,每小时数据:

/* 1 */
{
    "count" : 63713,
    "value" : 46151,
    "timestamp" : ISODate("2014-09-17T18:59:04.247+03:00"),
}

/* 2 */
{
    "count" : 63743,
    "value" : 48327,
    "timestamp" : ISODate("2014-09-17T19:59:04.281+03:00"),
}

/* 3 */
{
    "count" : 63761,
    "value" : 51650,
    "timestamp" : ISODate("2014-09-17T20:59:04.295+03:00"),
}

/* 4 */
{
    "count" : 63756,
    "value" : 52865,
    "timestamp" : ISODate("2014-09-17T21:59:04.298+03:00"),
}

之后,每两小时一次的数据:

/* sum of documents 1&2 */

{
    "count" : 117456,
    "value" : 94478,
    "timestamp" : ISODate("2014-09-17T18:59:04.247+03:00"),
}

/* sum of documents 3&4 */

{
    "count" : 127517,
    "value" : 104515,
    "timestamp" : ISODate("2014-09-17T20:59:04.295+03:00"),
}

1 个答案:

答案 0 :(得分:1)

实际上你的每两小时一次"一天中的数据将涵盖来自样本的三个时间段。所以文件1是两个小时的第一个,2& 3是在第二个,4是在第三个。

所以你真的可以在这里应用一些数学运算来在一天内获得12个两小时的间隔:

db.times.aggregate([
    { "$group": {
        "_id": {
            "$subtract": [
                { "$subtract": [ "$timestamp", new Date("1970-01-01") ] },
                { "$mod": [
                    { "$subtract": [ "$timestamp", new Date("1970-01-01") ] },
                    1000 * 60 * 60 * 2
                ]}
            ],
        },
        "count": { "$sum": "$count" },
        "value": { "$sum": "$value" }
    }},
    { "$sort": { "_id": 1 } }
])

这将生成一个时间戳值,表示两小时间隔的日期。或者您可以改为使用日期聚合运算符:

db.times.aggregate([
    { "$group": {
        "_id": {
            "day": { "$dayOfYear": "$timestamp" },
            "hour": {
                "$subtract": [
                    { "$hour": "$timestamp" },
                    { "$mod": [ { "$hour": "$timestamp" }, 2 ] }
                ]
            }
        },
        "count": { "$sum": "$count" },
        "value": { "$sum": "$value" }
    }},
    { "$sort": { "_id": 1 } }
])