我正在尝试使用mongo聚合在每个文档的时间戳周上对文档进行分组。所有时间戳都以UTC时间存储,我需要使用客户时间而不是UTC时间计算周。
我可以提供并添加客户端UTC偏移量,如下所示,但由于夏令时,这并不总是有效。偏移量因日期而异,因此调整所有时间戳与当前日期的偏移量不会。
是否有人知道按星期分组的方法,这些方法一直是夏令时的原因?
db.collection.aggregate([
{ $group:
{ "_id":
{ "$week":
{ "$add": [ "$Timestamp", clientsUtcOffsetInMilliseconds ] }
}
},
{ "firstTimestamp":
{ "$min": "$Timestamp"}
}
}
]);
答案 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
进行应用。