【问题标题】:MongoDB - Storing date without timezoneMongoDB - 存储没有时区的日期
【发布时间】:2016-11-18 23:11:26
【问题描述】:

我们有一个简单的应用程序,其中所有用户都在同一个时区,因此我们对将时区信息存储在 mongo 日期对象中不感兴趣。

采取这种极端步骤的原因是我们有多个使用由不同开发人员管理的通用数据库的微服务。他们每个人都需要在查询中明确设置与时区相关的内容,并在无效数据集中忘记相同的结果。

由于目前 MongoDB 的人 Mongo Data Types

不支持存储没有时区的日期。

只是想知道这是他们在 mongo 中表示没有时区的日期的任何替代方法,通过这种方法我们仍然可以利用 mongo 数据库查询基于日期的语法,如日期范围、日期等。

同时也方便 DBA 读取和管理记录。

【问题讨论】:

    标签: mongodb date mongodb-query spring-data-mongodb mongodb-java


    【解决方案1】:

    看看这个答案:https://stackoverflow.com/a/6776273/6105830

    您可以使用两种类型的长表示(毫秒或格式 yyyyMMddHHmmss)。这些是不存储时区但仍然能够进行范围查询的唯一方法。

    很遗憾,您丢失了一些聚合属性。但是你可以做一些事情,比如保留两个表示并在适当的时候使用它们。

    更新:

    不要像我之前所说的那样存储日期。您将失去 MongoDB 的许多功能,并且难以对日期字段执行主要操作。

    较新版本的 MongoDB 具有处理时区的运算符,它应该足以处理 ISOTime 格式。我的应用程序使用我自己的建议来存储日期。现在我必须让我的用户选择他们的时区(公司已经发展壮大,我们需要扩展到其他国家)。我们正在努力将所有模型更改为使用时间戳而不是标准化日期格式。 欲了解更多信息,请访问链接:https://docs.mongodb.com/manual/reference/method/Date/

    你也可以使用MongoDB官方社区频道提问 这是链接:https://developer.mongodb.com/community/forums/

    【讨论】:

    • 嗯,我在发布问题之前确实检查了这篇文章。这种方法的问题是它们都使人类无法读取日期。因此,之前可以直接在控制台上执行的任何 DBA 操作都需要使用一些转换包装器将人类可读的值转换为 int 值,反之亦然。从而导致不同的问题。
    • 我不认为格式 yyyyMMddHHmmss 不可读哈哈但是对于您的问题,我认为您可以做的另一种方法(可能只有一种)是存储时区并在查询中减去/添加时区偏移量,就像这个聚合(在java中): { "$project": { "date": { "$add": [ "$date", TimeZone.getDefault().getOffset(System.currentTimeMillis()) ] } } }
    • oopss 可能是我对 yyyyMMddHHmmss 的理解是错误的,我假设仅将提取值存储为 int/long。是的,我认为即使对于范围查询,它也应该可以完美地工作,尽管我们需要编写一些需要忽略年份的自定义正则表达式。另外,我也会尝试您建议的第二个解决方案。
    【解决方案2】:

    您可以考虑以 UTC 格式存储所有日期并以 UTC 格式呈现给用户,这样您就不会遇到客户端 JavaScript、服务器或 MongoDB 静默转换的问题,从而造成混乱。 你可以这样做: new Date(Date.UTC(2000, 01, 28)) 这是MDN link 的主题。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      相关资源
      最近更新 更多