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

bur*_*ger 37 mongodb

我刚开始学习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中存储日期是否有黄金标准?

Geo*_*oth 56

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

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

  • 同意.另外,我惊喜地发现`$ gt`和`$ lt`按照需要工作,日期存储为字符串:`.find({created:{$ gt:'2012-01-01'}}`事实上,返回自2012年1月1日以来创建的所有文档. (19认同)
  • 给予好评.将日期存储为BSON UTC日期/时间的最大缺点不是存储.它使你处理他们根本不适用的时区,并且它比解析简单的日期字符串更难.我还建议在MongoDB中将日期表示为字符串. (6认同)
  • 这样你就失去了所有的日期聚合选项。 (3认同)

Rem*_*iet 20

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

如果你迫切希望每个日期保存几个字节(再次,使用mongo的填充和最小块大小以及所有这些在极少数情况下都值得一试)你可以将日期存储为3字节二进制blob,方法是将其存储为YYYYMMDD格式的无符号整数,或2字节二进制blob,表示"X年1月1日以来的天数",其中X必须适当选择,因为它只支持跨越179年的日期范围.

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

  • 有效的用例是避免在JavaScript中处理时区的困难.请参阅下面的答案.我发现处理解析/格式化字符串(如`yyyy-mm-dd`)比尝试协调客户端和服务器时区以及在适当的日期创建`Date()`对象更容易.请记住,我们只是在这里保存日期,而不是日期时间. (3认同)
  • @Geoffrey 我指的是使用二进制数据来存储日期。将它们存储为字符串是完全有效的。也就是说,我坚决支持从不处理服务器端的时区,并将所有内容存储为 UTC。之后,您可以在客户端上进行时区转换。干净了许多。 (3认同)