如何从Spring Data MongoDB中的MongoDB ObjectId中提取时间戳?

时间:2012-07-11 16:49:27

标签: mongodb spring-data

MongoDB documentation建议从ObjectId中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用Spring Data MongoDB执行此操作?

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

3 个答案:

答案 0 :(得分:6)

ObjectId获取时间很容易......但是你不会得到ms精度。

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

我没有在Spring中使用MongoDB - 但是如果你能够实际使用ObjectId实例,就像调用上面的方法之一一样简单。

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

ObjectId(Date time)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

    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