我正在使用$group
按小时分组我的帖子,如:
"$group" : {
"_id" : {
"$hour" : {
$add : ["$createdAt", 10*60*60*1000]
}
},
...
}
但是现在我也希望按半小时分组,这意味着:
2:30 => 3:00
2:29 => 2:00
我如何使用mongo聚合来传递这个麻烦? 因为我的英语不好。 :)
答案 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中进行转换,而不仅仅是"分钟"的数值。间隔。
它只是标准的"日期数学",所以所有相同的操作都适用。