3

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

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

4

3 回答 3

7

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您通过创建的实例ObjectId(Date time)

于 2012-07-12T03:07:00.377 回答
1

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

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

于 2012-07-11T16:53:09.113 回答
1

感谢 phatduckk 的指导,这是我需要的 Spring Data 的代码片段。

    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
于 2012-07-19T14:03:31.907 回答