如何使用舍入将聚合分组半小时?

时间:2015-11-02 07:33:14

标签: mongodb sails.js mongodb-query aggregation-framework

我正在使用$group按小时分组我的帖子,如:

"$group" : {
    "_id" : {
        "$hour" : {
            $add : ["$createdAt", 10*60*60*1000]
        }
    },
    ...
}

但是现在我也希望按半小时分组,这意味着:

2:30 => 3:00
2:29 => 2:00

我如何使用mongo聚合来传递这个麻烦? 因为我的英语不好。 :)

1 个答案:

答案 0 :(得分:3)

我在这里收集+10是为了进行时区调整。相同的基本原则适用于生成30分钟舍入的日期,除非您想先转换为数值并通过模数($mod)回溯间隔:

    { "$group": {
        "_id": {
            "$add": [
                { "$subtract": [
                    { "$subtract": [
                        { "$add": [ "$createdAt", 1000 * 60 * 60 * 10 ] },
                        new Date(0) 
                    ]},
                    { "$mod": [
                        { "$subtract": [
                            { "$add": [ "$createdAt", 1000 * 60 * 60 * 10 ] }, 
                            new Date(0)
                        ]},
                        1000 * 60 * 30
                    ]}
                ]},
                new Date(0)
            ]
        },
        "count": { "$sum": 1 } // or whatever accumulation required
    }}

将纪元日期(Date(0))与存储日期(已调整)中的$subtract操作一起使用,将从纪元开始将毫秒数作为存储日期的数值返回。在30分钟内以毫秒为单位的模运算返回当前日期的余数,然后再$subtract再次获得舍入间隔。

$add操作同样存在,其中纪元日期对象再次返回Date

所以每个间隔开始现在是分组键,每30分钟一次。

您可以交替使用日期聚合运算符,但这会返回一个BSON Date对象,该对象将在API中进行转换,而不仅仅是"分钟"的数值。间隔。

它只是标准的"日期数学",所以所有相同的操作都适用。