【问题标题】:How do you extract a timestamp from a MongoDB ObjectId in Spring Data MongoDB?如何从 Spring Data MongoDB 中的 MongoDB ObjectId 中提取时间戳?
【发布时间】:2012-07-11 16:49:27
【问题描述】:

MongoDB documentation 建议从 ObjectId 中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用 Spring Data MongoDB 做到这一点?

特别是,我想查询插入特定日期范围的文档。

【问题讨论】:

    标签: mongodb spring-data


    【解决方案1】:

    很容易从 ObjectId... 获取时间,但是您无法获得毫秒精度。

    org.bson.types.ObjectId 有 2 种方法可供您使用:getTimeSecond()getTime()(与 `getTimeSecond() * 1000L 相同)。这些将获得您的 unix 时间戳。

    我没有将 MongoDB 与 Spring 一起使用 - 但如果您能掌握实际的 ObjectId 实例,它就像调用上述方法之一一样简单。

    现在 - 要查询某个时间范围内的文档,您必须倒退并根据时间戳创建 ObjectId 对象。再一次 - 这很简单 - ObjectId 有一个构造函数可以为您执行此操作:

    ObjectId(Date time)

    所以 - 创建 2 个 ObjectId 实例来代表您的最小和最大时间范围,然后执行如下查询:

    db.collection.find({ "field" : { $gt: value1, $lt: value2 } } );

    其中value1value2 代表您通过ObjectId(Date time) 创建的ObjectId 实例

    【讨论】:

      【解决方案2】:

      我没有看到推荐。文档只说 可能 从 ObjectId 获取插入时间。如文档中所述,按 _id 排序也是按插入时间排序。

      通过一定的额外努力,可以进行相等/范围查询,但我会为此使用单独的(索引)字段。

      【讨论】:

      • 我引用“此页面列出了一些建议。” “从 _id 中提取插入时间,而不是使用单独的时间戳字段。”我忘记了它们被称为范围查询,因此我找到了stackoverflow.com/questions/11192136/…。我会看看这是否有效。
      • @EmersonFarrugia:嗯,是的,这样可以工作。那我应该删除我的答案吗? :)
      • 不,但我至少会编辑它。 :) 这确实建议,因为 ObjectId 为您提供了第二个粒度的插入时间免费索引。
      • @EmersonFarrugia:“没有免费索引这回事”,他们说 :) 例如,查询更难。
      【解决方案3】:

      感谢 phatduckk 的指导,这是我需要的 Spring Data 代码 sn-p。

          org.springframework.data.mongodb.core.query.Criteria criteria = ...;
      
          if (startTimestamp != null || endTimestamp != null) {
              criteria = criteria.and("_id");
      
              if (startTimestamp != null) {
                  criteria = criteria.gte(new ObjectId(startTimestamp.toDate()));
              }
      
              if (endTimestamp != null) {
                  criteria = criteria.lt(new ObjectId(endTimestamp.toDate()));
              }
          }
      
          // use criteria
      

      【讨论】:

      • 如何在 Spring Boot 中从对象 ID 获取时间戳?
      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 2020-06-25
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2011-09-21
      相关资源
      最近更新 更多