我已经阅读了很多关于如何在 MongoDB 中存储简单日期(没有时间)的内容,但我仍然找不到答案。 有人说像 MongoDate(日期 + utc 时间)一样存储主题,有人说像 YYYYMMDD 字符串一样存储主题,还有一些人喜欢其他有趣的方式。最正确的方法似乎是 MongoDate,但为什么我要把出生日期存储为 UTC 时间的日期?
另外,出生日期“1990-05-21”存储为“1990-05-20T23:00:00Z”(前一天):该日期不应根据时区而变化,但在世界范围内保持不变.
我仍然想知道为什么 MongoDB 不像所有其他数据库那样提供简单的“日期”类型。
简单使用:
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 日)以来的毫秒数。
正如评论中提到的,这几乎取决于您的最终目标。我建议您使用 MongoDate,因为它是 MongoDB 中日期的本机格式,并且对于其他开发人员来说会保持直观。 并且本机类型支持一系列开箱即用的有用方法,例如,您可以在 Map-Reduce 作业中使用这些方法。
另外,出生日期“1990-05-21”存储为“1990-05-20T23:00:00Z”(前一天)
我认为发生这种情况只是因为您服务器上的时区是 UTC+1。您可以在保存到数据库之前手动将时区设置为 UTC,这将解决您的问题。
将其存储为简单的字符串“1985-21-07”。这听起来可能违反直觉 并点亮你的红色“数据库类型”灯泡,但是将出生日期保存为 Date() 会带来许多“部分”(小时、分钟、秒...),这些部分没有任何意义并且会引起头痛在 mongo 中保存和获取出生日期时容易出错。
阅读此处的最高答案(未标记为正确的答案): 在 MongoDB 中存储日期的最佳方式是什么?
这是一个有趣的问题,但很难回答。正如 @Andrey Degtyaruk 已经注意到的,这一切都与这些数据的目的有关。
就我而言,我解决了几乎相同的问题,如下所示:
store time like a YYYYMMDD string
但是,方式有点不同。因为“timestamp”字段已经被 MongoDB 保留(根据 BSON 文档),我将日期转换为时间戳(如果您感兴趣,可以使用这些 js 脚本之一)并将其存储在数据库中作为“lastModified”: “数字”。
我不确定我的方法是否与您的出生日期案例相关,但这仍然是一种方法,您可以尝试一下。
我也在寻找这个问题的最佳解决方案,在阅读这些答案时,我认为最简单的解决方案会忽略时间,从而忽略时区变化,但仍然允许对人的年龄等进行比较和查询。类似于 YYYYMMDD 的整数格式。
因此对于出生日期 1980 年 3 月 12 日,这将被保存为整数 19800312。
然后我找到了 Mongoose 的这个插件,它或多或少具有以下功能:https://github.com/boblauer/mongoose-dateonly
唯一的缺点是如果你想使用聚合框架,你必须直接使用 DateOnly 。
有人知道如何存储注册时使用的实际日期和时间吗?