Podstawową koncepcją jest sprawienie, aby zapytanie było „świadome”, kiedy „czas letni” zarówno „rozpoczyna się”, jak i „kończy się” w danym okresie zapytania i po prostu dostarcza ten test do $cond
aby określić, którego „przesunięcia” użyć:
db.collection.aggregate([
{ "$group": {
"_id": {
"$week": {
"$add": [
"$Timestamp",
{ "$cond": [
{ "$and": [
{ "$gte": [
{ "$dayOfyear": "$Timestamp" },
daylightSavingsStartDay
]},
{ "$lt": [
{ "$dayOfYear": "$Timestamp" },
daylightSavingsEndDay
]}
]},
daylightSavingsOffset,
normalOffset
]}
]
}
},
"min": { "$min": "$Timestamp" }
}}
])
Możesz więc trochę to skomplikować, gdy obejmujesz kilka lat, ale nadal jest to podstawowa zasada. Na półkuli południowej jesteś zawsze obejmujący rok, więc każdy warunek byłby „zakresem” od „początku” do „końca roku” i od „początku roku” do „końca”. Dlatego $or
z wewnętrznym $and
w obrębie zademonstrowanych operatorów „zakresu”.
Jeśli masz różne wartości do zastosowania, wykryj, kiedy „należy” wybrać jedną z nich, a następnie zastosuj za pomocą $cond
.