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

问题描述 投票:0回答:6

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

另外,出生日期“1990-05-21”存储为“1990-05-20T23:00:00Z”(前一天):该日期不应根据时区而变化,但在世界范围内保持不变.

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

mongodb date datetime utc
6个回答
3
投票

简单使用:

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
投票

正如评论中提到的,这几乎取决于您的最终目标。我建议您使用 MongoDate,因为它是 MongoDB 中日期的本机格式,并且对于其他开发人员来说会保持直观。 并且本机类型支持一系列开箱即用的有用方法,例如,您可以在 Map-Reduce 作业中使用这些方法。

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

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


1
投票

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

阅读此处的最高答案(未标记为正确的答案): 在 MongoDB 中存储日期的最佳方式是什么?


0
投票

这是一个有趣的问题,但很难回答。正如 @Andrey Degtyaruk 已经注意到的,这一切都与这些数据的目的有关。

就我而言,我解决了几乎相同的问题,如下所示:

store time like a YYYYMMDD string

但是,方式有点不同。因为“timestamp”字段已经被 MongoDB 保留(根据 BSON 文档),我将日期转换为时间戳(如果您感兴趣,可以使用这些 js 脚本之一)并将其存储在数据库中作为“lastModified”: “数字”。

我不确定我的方法是否与您的出生日期案例相关,但这仍然是一种方法,您可以尝试一下。


0
投票

我也在寻找这个问题的最佳解决方案,在阅读这些答案时,我认为最简单的解决方案会忽略时间,从而忽略时区变化,但仍然允许对人的年龄等进行比较和查询。类似于 YYYYMMDD 的整数格式。

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

然后我找到了 Mongoose 的这个插件,它或多或少具有以下功能:https://github.com/boblauer/mongoose-dateonly

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


0
投票

有人知道如何存储注册时使用的实际日期和时间吗?

© www.soinside.com 2019 - 2024. All rights reserved.