【发布时间】:2012-07-11 16:49:27
【问题描述】:
MongoDB documentation 建议从 ObjectId 中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用 Spring Data MongoDB 做到这一点?
特别是,我想查询插入特定日期范围的文档。
【问题讨论】:
标签: mongodb spring-data
MongoDB documentation 建议从 ObjectId 中提取插入时间,而不是使用单独的时间字段。有谁知道如何使用 Spring Data MongoDB 做到这一点?
特别是,我想查询插入特定日期范围的文档。
【问题讨论】:
标签: mongodb spring-data
很容易从 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(Date time) 创建的ObjectId 实例
【讨论】:
我没有看到推荐。文档只说 可能 从 ObjectId 获取插入时间。如文档中所述,按 _id 排序也是按插入时间排序。
通过一定的额外努力,可以进行相等/范围查询,但我会为此使用单独的(索引)字段。
【讨论】:
感谢 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
【讨论】: