Подтвердить что ты не робот

Каков наилучший способ хранения datetimes (временных меток) в CouchDB?

Я думаю, что строки времени UTC, такие как 2011-01-26 21:41:09 +0000, могут быть в порядке, поскольку они правильно сортируются, если они используются в ключе вида, но сохранение часового пояса (например, 2011-01-26 16:41:09 -0500) сделает документ более удобочитаемым. Преобразование даты в целое число эпохи представляется наименее привлекательным с точки зрения читаемости, но, возможно, лучше всего подходит для производительности (или это имеет значение?). Какая рекомендуемая практика здесь?

4b9b3361

Ответ 1

Время - одномерное. Временная метка плюс часовой пояс двумерная, описывающая момент времени и местоположение. Представления Couch являются одномерными (но не плагинами GeoCouch), поэтому сохранение в общей зоне (UTC) является разумным.

Вероятно, наиболее перспективный формат - это строка, которая, естественно, сортируется в хронологическом порядке. Вероятно, наиболее удобным таким форматом является то, что выдает JSON2:

> a = new Date();
Thu Jan 27 2011 18:40:52 GMT+0700 (ICT)
> JSON.stringify(a)
"2011-01-27T11:40:52.280Z"

Ответ 2

Если вы просто используете карту карты Карты, уменьшите, чем эти предложения, вероятно, прекрасны. Если, однако, вы хотите уменьшить результаты (_count, _stats, _sum), я бы рекомендовал испускать ваши даты в виде массивов, чтобы вы могли использовать group_level.

Например, если вы испускаете (doc.date.split('-')) строки даты, отформатированные как "2011-02-14", вы можете вернуть _count (например) в день, месяц и год, используя group_level = 3, 2 и 1 соответственно.

Вы можете дополнительно фильтровать данные, добавляя не-данные к началу ключа. Например, если вы выводили имена Twitter, ваш ключ мог бы выглядеть как [ "bigbluehat", "2011", "02", "14" ], и ваше сокращение может вернуть общее количество всех твитов для пользователя "bigbluehat" как а также статистику для этого пользователя через день, месяц и год.

Если вы не используете уменьшающую сторону вещей, тогда строковые ключи, вероятно, прекрасны.

Ответ 3

Независимо от того, какое хранилище данных я использую, я обычно хочу, чтобы временная метка unix была там как поле, в которое я буду включать один для созданной даты, а затем обновленное поле, которое я могу изменить при изменении документа.

Я предпочитаю обычный "секунда с эпохи", а не "миллисекунды с эпохи" просто для брекетов.

Math.round(new Date().getTime()/1000) делает трюк для меня.

С точки зрения удобочитаемости я хочу сохранить его как целое для простого сравнения и использовать переднюю часть, чтобы отобразить его красиво.

Ответ 4

Вы можете хранить свои даты, как вам хочется *, это то, как важно вывести их в свои представления.

* Пока Date.parse() может его прочитать.

Здесь есть хорошее решение: Сортировка дат в представлениях CouchDB

Ответ 5

Мне нравится использовать миллисекунды с прошлой эпохи. Вы можете понять это:

new Date().valueOf()

Вы можете создать новую дату из миллисекунд с помощью:

var milliseconds = new Date().valueOf();
var date = new Date(milliseconds);

Мне нравится создавать представление, где временная метка (в миллисекундах) - это сортировка b/c ключей, которая очень проста.

Кроме того, я думаю, что использование целых чисел более эффективно, чем строки, по крайней мере, когда дело доходит до работы с данными вне CouchDB.