2015-11-02 60 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中轉換,而不僅僅是「分鐘」間隔的數值。

這只是標準的「日期數學」,因此所有相同的操作都適用。