Работа с датами в Дерби
Closed this issue · 7 comments
Привет, хочу спросить какие практики работы датой существуют в Дерби.
Сейчас Дерби записывает дату как стринг и разработчики говорят, что дату нужно хранить в виде тайштампа.
Проблема в том, что в обоих случаях происходит потеря информации, например часовой пояс теряется. Что если сайтом пользуются люди из разных часовых поясов? Ну или кто-то умышленно отвел часы назад?
Получается, создавать дату на клиенте — моветон — можно только на сервере.
Допустим, я создаю фейсбук и мне нужно вывести меню архива: https://www.dropbox.com/s/peawsgvw07o8z08/Screenshot%202014-07-26%2014.39.47.png
Из таймштампа не получить группировку по году. Остается хранить год (и месяц) отдельно (избыточность), допустим мы сделали это. Как тогда сделать запрос с группировкой (исходим из того что на клиенте мы не хотим грузить и фильтровать большие массивы данных)?
Насчет зон. Date.now() работает через UTC, но тем не менее проблемы с клиентами это не решает, как и с группировками.
Расскажу как делаем мы:
- используем timestamps
- дату в бд записываем только на сервере при помощи хуков
- группировки (в нашем случае по дням - у нас чат) делаем при помощи реактивных функций. (нужно вывести некоторое количество сообщений сгруппировав их по дням - запускаем реактивную функцию, которая пробегается по всем загруженным на клиентвсем сообщениям и составляет список "дней" - во вьюхе выводим в двух циклах: первый по дням, второй по сообщениям)
Из таймштампа не получить группировку по году.
Мы без проблем достаем день из таймштампа и делаем группировку - все это на клиенте.
В чате у нас даты "from now" - они одинаково работают и на клиенте и на сервере (единственный костыль используем для их вывода unescape, чтобы аттач бининга не сломался). Если же нам нужно выводить именно клиентское время - на сервере выводим прозрачным шрифтом, на клиенте в create компоненты обновляем.
Часовой пояс не храним - нафига он нужен не понимаем :)
Как тогда сделать запрос с группировкой (исходим из того что на клиенте мы не хотим грузить и фильтровать большие массивы данных)?
Запросов с группировкой в монге не бывает (группировку сделаем на клиенте). Все сводится к тому, что нужно в запросе отобрать нужныйй год - это же не проблема date: {$lte: +Date('01012009')} к примеру. Монга это все позволяет без проблем.
Артур, спасибо за ответ.
Зона нужна, чтобы клиент корректную дату видел с учетом своей зоны.
Но в нашем случае грузить весь архив только для того чтобы построить меню это явная избыточность, со временем он станет большим, нужна группировка на уровне базы.
Добавил distinct и mapReduce в livedb-mongo. Нейт добавил aggrigate - так что теперь все есть.
Привет. Круто!