MongoDB文档建议从 ObjectId 中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用 Spring Data MongoDB 做到这一点?
特别是,我想查询插入特定日期范围的文档。
MongoDB文档建议从 ObjectId 中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用 Spring Data MongoDB 做到这一点?
特别是,我想查询插入特定日期范围的文档。
从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 } } );
在哪里value1
并value2
表示ObjectId
您通过创建的实例ObjectId(Date time)
我在那里没有看到推荐。文档只说可以从 ObjectId 获取插入时间。如文档中所述,按 _id 排序也是按插入时间排序。
通过一定的额外努力,可以进行相等/范围查询,但我会为此使用单独的(索引)字段。
感谢 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