это Каков наилучший способ хранения дат в MongoDB?




mongodb что это (3)

Если вы действительно заботитесь о сохранении 4 байта на поле (в случае, если у вас много полей DATE каждого документа), вы можете хранить даты как int32 поля в форме 20110720 (примечание MySQL DATE занимает 3 байта, поэтому в любом случае 20110720 хранилища будет больше). В противном случае мне лучше придерживаться стандартного типа даты и времени.

Я только начинаю узнавать о MongoDB и надеяться медленно перейти от MySQL.

В MySQL существуют два разных типа данных: DATE ('0000-00-00') и DATETIME ('0000-00-00 00:00:00') . В моей MySQL я использую тип DATE , но я не уверен, как перенести их в MongoDB. В MongoDB существует объект Date , который сопоставим с DATETIME . Кажется, было бы наиболее целесообразно использовать объекты Date , но это будет тратить пространство, так как часы, min, sec не используются. С другой стороны, хранение дат в виде строк кажется неправильным.

Есть ли золотой стандарт для хранения дат ('0000-00-00') в MongoDB?


Я фактически перерабатываю базу данных MongoDB, где даты хранятся как соответствующие типы Date (), вместо этого сохраняют их как строки в форме yyyy-mm-dd . Почему, учитывая, что каждый другой ответчик говорит, что это ужасная идея? Проще говоря, из-за бесконечной боли, которую я испытывал, пытаясь работать с датами в JavaScript, которая не имеет (реальной) концепции часовых поясов. Я сохранял даты UTC в MongoDB, то есть объект Date () с моей желаемой датой и временем, установленным в качестве полуночного UTC, но это неожиданно сложно и подвержено ошибкам, чтобы получить датированную пользователем дату, правильно преобразованную в это из любого часового пояса. случается, в. Я изо всех сил пытаюсь заставить код JavaScript «любой локальный часовой пояс для UTC» работать (и да, я знаю Sugar.js и Moment.js), и я решил, что простые строки, такие как хороший старый стандарт MySQL yyyy-mm-dd - это путь, и я буду анализировать объекты Date () по мере необходимости во время выполнения на стороне клиента.

Кстати, я также пытаюсь синхронизировать эту базу данных MongoDB с базой данных FileMaker, которая также не имеет понятия о часовых поясах. Для меня простота просто не хранить данные времени, особенно когда это бессмысленно, как полутоновая UTC, помогает обеспечить код с меньшей ошибкой, даже если мне приходится разбираться со строковыми датами сейчас и потом.


BSON (формат данных хранения, используемый mongo изначально) имеет выделенный тип даты UTC datetime, который представляет собой 64-битное (так, 8 байт) целое число, обозначающее миллисекунды с момента времени Unix. Существует очень мало веских причин, по которым вы бы использовали любой другой тип для хранения дат и временных меток.

Если вы отчаянно пытаетесь сохранить несколько байт за дату (опять же, с добавлением магна и минимальным размером блока, и все это только стоит проблем в очень редких случаях), вы можете хранить даты в виде 3-байтового двоичного блока, сохраняя его как беззнаковое целое в формате YYYYMMDD или двухбайтный двоичный код, обозначающий «дни с 1 января года X», где X должен быть выбран соответствующим образом, поскольку это поддерживает только диапазон дат, охватывающий 179 лет.

EDIT: Как видно из приведенного ниже обсуждения, это очень жизнеспособный подход в очень редких случаях. В основном; использовать родной тип даты mongo;)





mongodb