MongoDB documentation建议从ObjectId中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用Spring Data MongoDB执行此操作?
特别是,我想查询在特定日期范围内插入的文档。
答案 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 } } );
其中value1
和value2
代表您通过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