Khái niệm cơ bản ở đây là làm cho truy vấn của bạn "biết" thời điểm "tiết kiệm ánh sáng ban ngày" cả "bắt đầu" và "kết thúc" trong khoảng thời gian truy vấn nhất định và chỉ cần cung cấp thử nghiệm này cho $cond
để xác định "bù đắp" nào sẽ sử dụng:
db.collection.aggregate([
{ "$group": {
"_id": {
"$week": {
"$add": [
"$Timestamp",
{ "$cond": [
{ "$and": [
{ "$gte": [
{ "$dayOfyear": "$Timestamp" },
daylightSavingsStartDay
]},
{ "$lt": [
{ "$dayOfYear": "$Timestamp" },
daylightSavingsEndDay
]}
]},
daylightSavingsOffset,
normalOffset
]}
]
}
},
"min": { "$min": "$Timestamp" }
}}
])
Vì vậy, bạn có thể làm cho điều đó phức tạp hơn một chút khi trải qua vài năm, nhưng nó vẫn là nguyên tắc cơ bản. Ở Nam bán cầu, bạn luôn luôn kéo dài một năm nên mỗi điều kiện sẽ là một "phạm vi" từ "bắt đầu" đến "cuối năm" và "đầu năm" đến "kết thúc". Do đó, một $or
với $and
bên trong trong các toán tử "phạm vi" được trình bày.
Nếu bạn có các giá trị khác nhau để áp dụng, hãy phát hiện khi nào bạn "nên" chọn một trong hai và sau đó áp dụng bằng cách sử dụng $cond
.