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

时间:2017-04-21 10:17:51

标签: mongodb date datetime utc

我已经阅读了很多关于如何在MongoDB中存储简单日期(没有时间)的内容,但我仍然找不到答案。 有人说存储主题像MongoDate(日期+ utc时间),有人说存储主题像YYYYMMDD字符串,有些像其他有趣的方式。最正式的方式似乎是MongoDate,但为什么我应该将出生日期存储为UTC时间的日期?

另外,出生日期“1990-05-21”存储为“1990-05-20T23:00:00Z”(前一天):此日期不应根据时区而改变,但保持不变全世界。

我仍然想知道为什么MongoDB不提供简单的“日期”类型,就像所有其他数据库一样。

5 个答案:

答案 0 :(得分:2)

只需使用:

new Date("<YYYY-mm-dd>");

哪个将返回具有指定日期且没有时间戳的ISODate。 MongoDB使用ISO-8601日期符号表示日期对象。这样,提供了许多日期操作。即

  • new Date("<YYYY-mm-dd>")返回具有指定日期的ISODate。

  • new Date("<YYYY-mm-ddTHH:MM:ss>")在客户端的 本地时区 中指定日期时间,并以UTC返回具有指定日期时间的ISODate。

  • new Date("<YYYY-mm-ddTHH:MM:ssZ>")以UTC指定日期时间,并以UTC返回具有指定日期时间的ISODate。

  • new Date(<integer>)将日期时间指定为自Unix时代(1970年1月1日)以来的毫秒数,并返回生成的ISODate实例。

在内部,日期对象甚至还存储为带符号的64位整数,代表自Unix时代(1970年1月1日)以来的毫秒数。

答案 1 :(得分:0)

正如评论中所提到的,它几乎取决于你的最终目标。我建议你使用MongoDate,因为它是MongoDB中日期的原生格式,并且会让其他开发人员保持直观。 原生类型支持开箱即用的各种有用方法,例如,您可以在map-reduce作业中使用这些方法。

  

另外,出生日期&#34; 1990-05-21&#34;存储为&#34; 1990-05-20T23:00:00Z&#34; (前一天)

我认为这只是因为服务器上的时区是UTC + 1。您可以在保存到数据库之前手动将时区设置为UTC,它将解决您的问题。

答案 2 :(得分:0)

这是一个有趣的问题,不容易回答。正如@Andrey Degtyaruk已经注意到这些都是关于这些数据的目的。

在我的情况下,我解决了几乎相同的问题:

store time like a YYYYMMDD string

但是,有点不同的方式。因为MongoDB(according to BSON docs)已经保留了“timestamp”字段,所以我将日期转换为时间戳(you could use one of these js scripts if you're interested)并将其作为“lastModified”存储在DB中:“Number”。

我不确定我的方法可能与您的出生日期相关,但它仍然是一种方式,您可以尝试。

答案 3 :(得分:0)

我也在寻找针对此问题的最佳解决方案,并且在阅读这些答案时,我认为最简单的解决方案将忽略时间,从而避免时区偏移,但仍允许对人的年龄等进行比较和查询。沿YYYYMMDD的行使用整数格式。

因此对于1980年3月12日的出生日期,该日期将保存为整数19800312。

然后我发现了这个用于Mongoose的插件,它或多或少地做到了:https://github.com/boblauer/mongoose-dateonly

唯一的缺点是,如果要使用聚合框架,则必须直接使用DateOnly。

答案 4 :(得分:0)

将其存储为一个简单的字符串“1985-21-07”。这听起来可能违反直觉 并点亮你的红色“数据库类型”灯泡,但将出生日期保存为 Date() 会带来许多“部分”(小时、分钟、秒......),这些“部分”没有任何意义,会引起头痛在 mongo 中保存和获取出生日期时容易出错。

在此处阅读最高答案(不是标记为正确的答案): What is the best way to store dates in MongoDB?