У нас есть особая потребность, когда нам нужно выполнить агрегацию по полям времени с учетом определенной «маржи» и обработки, пересекающей границы летнего времени.
Предположим, у нас есть проект, который начинается в момент времени starts_at
и заканчивается в момент времени ends_at
мы на самом деле хотим глобализировать все события, которые были созданы от starts_at - safety_margin
до ends_at
Итак, у нас есть документы, которые выглядят так:
project: { "starts_at": "2019-04-01T10:28:05.711Z", "ends_at": "2019-01-29T10:28:05.711Z" }
А safety_margin
на данный момент является константой в 1 неделю (переводится в миллисекунды в нашей агрегации MongoDB)
В нашей агрегации мы имеем следующую стадию
{ '$project': {
safety_margin_starts_at: {
'$subtract': ['$starts_at', safety_margin_duration]
},
}
Это полностью завершится с DST с заданным контекстом:
- Часовой пояс Франции (смещение +2 до 1 апреля, становится +1 после первого апреля)
- Проект, который начинается впосле 1-го или апреля (таким образом, смещение +1 в FR) и с запасом прочности оно становится 25 марта (смещение +2)
в наших спецификациях это приведет к ошибке
project.starts_at # => Mon, 01 Apr 2019 15:35:52 CEST +02:00
project.safety_margin_starts_at # => Mon, 25 Mar 2019 15:35:52 CET +01:00
# [Running our test]
expected 2019-03-25 13:35:52.357000000 +0000 to be within 0.1 of 2019-03-25 15:35:52 +0100
# The first figure is the one returned from the aggregation
Наше приложение соde фактически делает умное вычитание, где starts_at - safety_margin_duration
становится тем же днем / тем же часом независимо от изменений летнего времени при вычитании дней.Можно ли воспроизвести это поведение в MongoDB?У вас есть несколько советов о том, как решить эти проблемы?
Может быть, это может быть решением, но я слышал о новом способе манипулирования временем в агрегации, может ли это решить мою проблему?