在MongoDB中存储日期的最佳方法是什么?

时间:2011-07-20 15:56:18

标签: mongodb

我刚刚开始了解MongoDB并希望从MySQL慢慢迁移。

在MySQL中,有两种不同的数据类型 - DATE ('0000-00-00')DATETIME ('0000-00-00 00:00:00')。在我的MySQL中,我使用DATE类型,但我不确定如何将它们转移到MongoDB中。在MongoDB中,有一个Date对象,与DATETIME相当。使用Date对象似乎是最合适的,但这会浪费空间,因为没有使用小时,分钟,秒。另一方面,将日期存储为字符串似乎是错误的。

在MongoDB中存储日期('0000-00-00')是否有黄金标准?

3 个答案:

答案 0 :(得分:51)

我实际上正在转换一个MongoDB数据库,其中日期存储为正确的Date()类型,而不是将它们存储为yyyy-mm-dd形式的字符串。为什么,考虑到其他所有的回答者都说这是一个可怕的想法?简单地说,由于无休止的痛苦,我一直在努力尝试使用JavaScript中的日期,这些日期没有(真正的)时区概念。我一直在MongoDB中存储UTC日期,即一个Date()对象,其中包含我想要的日期和设置为午夜UTC的时间,但它出乎意料地复杂且容易出错,以便将用户提交的日期正确转换为来自任何时区的日期碰巧在。我一直在努力让我的JavaScript“无论本地时区到UTC”代码都能正常工作(是的,我知道Sugar.js和Moment.js)并且我已经决定使用简单的字符串了好的旧MySQL标准yyyy-mm-dd是要走的路,我将在客户端运行时根据需要解析为Date()对象。

顺便说一句,我也尝试将这个MongoDB数据库与FileMaker数据库同步,后者也没有时区概念。对我来说,简单的存储时间数据,特别是当它像UTC午夜一样毫无意义时,有助于确保较少错误的代码,即使我必须时不时地解析字符串日期。

答案 1 :(得分:18)

BSON(本机mongo使用的存储数据格式)有一个dedicated date type UTC datetime,它是64位(因此,8字节)有符号整数,表示自Unix时间纪元以来的毫秒数。您使用任何其他类型存储日期和时间戳的原因很少。

如果你迫切希望每个日期保存几个字节(再次,使用mongo的填充和最小块大小,这一切在非常罕见的情况下只值得麻烦)你可以通过存储将日期存储为3字节的二进制blob它是YYYYMMDD格式的无符号整数,或2字节的二进制blob,表示“X年1月1日以来的天数”,其中X必须适当选择,因为它只支持跨越179年的日期范围。

编辑:正如下面的讨论所表明的那样,在极少数情况下这只是一种可行的方法。 <强>基本上;使用mongo的原生日期类型;)

答案 2 :(得分:2)

如果您真的关心每个字段保存4个字节(如果每个文档有多个DATE字段),您可以将日期存储为int32形式的20110720字段(注意MySQL { {1}}占用3个字节,因此在任何情况下存储都会更大)。否则我最好坚持标准的日期时间类型。