Das Grundkonzept hier besteht darin, Ihrer Abfrage „bewusst“ zu machen, wann die „Sommerzeit“ für den angegebenen Abfragezeitraum „beginnt“ und „endet“, und diesen Test einfach an $cond
um zu bestimmen, welcher "Offset" verwendet werden soll:
db.collection.aggregate([
{ "$group": {
"_id": {
"$week": {
"$add": [
"$Timestamp",
{ "$cond": [
{ "$and": [
{ "$gte": [
{ "$dayOfyear": "$Timestamp" },
daylightSavingsStartDay
]},
{ "$lt": [
{ "$dayOfYear": "$Timestamp" },
daylightSavingsEndDay
]}
]},
daylightSavingsOffset,
normalOffset
]}
]
}
},
"min": { "$min": "$Timestamp" }
}}
])
Man kann das also etwas komplexer machen, wenn man mehrere Jahre abdeckt, aber es ist immer noch das Grundprinzip. Auf der Südhalbkugel sind Sie immer ein Jahr überspannt, so dass jede Bedingung ein "Bereich" von "Beginn" bis "Ende des Jahres" und "Anfang des Jahres" bis "Ende" wäre. Also ein $or
mit einem inneren $and
innerhalb der "range"-Operatoren demonstriert.
Wenn Sie unterschiedliche Werte anwenden müssen, erkennen Sie, wann Sie einen auswählen "sollten", und wenden Sie ihn dann mit $cond
.