2015-11-02 63 views
3

我使用$group到组我的岗位按小时,如:如何使用聚合按半小时分组?

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

但现在我也想组通过半的小时,它的意思是:

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

我如何使用蒙戈汇总来传递这个麻烦? Sr我的英语不好。 :)

回答

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中转换,而不仅仅是“分钟”间隔的数值。

这只是标准的“日期数学”,因此所有相同的操作都适用。