Каков наилучший способ хранить даты в MongoDB? - PullRequest
36 голосов
/ 20 июля 2011

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

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

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

Ответы [ 3 ]

53 голосов
/ 15 октября 2013

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

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

18 голосов
/ 21 июля 2011

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

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

РЕДАКТИРОВАТЬ: Как показывает обсуждение ниже, это только жизнеспособный подход в очень редких случаях. В основном, используйте родной тип даты Монго;)

2 голосов
/ 20 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...