使用夏令时偏移按日期汇总组

时间:2016-04-07 02:02:12

标签: mongodb mongodb-query aggregation-framework

我正在尝试使用mongo聚合在每个文档的时间戳周上对文档进行分组。所有时间戳都以UTC时间存储,我需要使用客户时间而不是UTC时间计算周。

我可以提供并添加客户端UTC偏移量,如下所示,但由于夏令时,这并不总是有效。偏移量因日期而异,因此调整所有时间戳与当前日期的偏移量不会。

是否有人知道按星期分组的方法,这些方法一直是夏令时的原因?

db.collection.aggregate([
    { $group: 
        { "_id": 
            { "$week": 
                { "$add": [ "$Timestamp", clientsUtcOffsetInMilliseconds ] } 
            } 
        },
        { "firstTimestamp": 
            { "$min": "$Timestamp"}
        }
    }   
]);

1 个答案:

答案 0 :(得分:0)

这里的基本概念是让您的查询“了解”在给定查询期间“夏令时”何时“开始”和“结束”,并简单地将此测试提供给$cond以确定哪个“偏移”使用:

db.collection.aggregate([
    { "$group": {
       "_id": {
           "$week": {
               "$add": [
                  "$Timestamp",
                  { "$cond": [
                      { "$and": [
                          { "$gte": [
                             { "$dayOfyear": "$Timestamp" },
                             daylightSavingsStartDay 
                          ]},
                          { "$lt": [ 
                             { "$dayOfYear": "$Timestamp" },
                             daylightSavingsEndDay
                          ]}
                      ]},
                      daylightSavingsOffset,
                      normalOffset
                  ]}
               ]
           }
       },
       "min": { "$min": "$Timestamp" }
    }}
])

所以你可以在覆盖几年时让它变得更复杂,但它仍然是基本原则。在南半球,你总是跨越一年,所以每个条件都是“开始”到“年末”和“年初”到“结束”的“范围”。因此,“范围”运算符中的内部$or $and已展示。

如果要应用不同的值,请检测何时“应该”选择其中一个,然后使用$cond进行应用。