如何将Mongo Shell查询转换为Spring Boot Reactive MongoDB Java代码
解决Reactive MongoDB查询ObjectId不匹配的问题
嘿,你的问题根源很明确——你在代码里直接把ObjectId的字符串值传给了gt()方法,但MongoDB中的_id字段是ObjectId类型,不是普通字符串,这就导致查询条件类型不匹配,自然查不到结果啦。
修正后的代码
先确保你导入了org.bson.types.ObjectId类,然后把字符串转换为ObjectId实例再传入查询条件:
@Service public class MongoService { private final ReactiveMongoTemplate mongo; // Spring 4.3+ 支持构造方法自动注入,无需添加@Autowired public MongoService(ReactiveMongoTemplate mongo) { this.mongo = mongo; } public Flux<Device> getObjectsByTimestamp(String timestamp) { // 将字符串形式的ObjectId转换为ObjectId实例 ObjectId targetId = new ObjectId("5fd931e00000000000000000"); Query query = new Query(Criteria.where("_id").gt(targetId)); return mongo.find(query, Device.class, "devices"); } }
额外说明
- 类型匹配的重要性:Mongo Shell中的
ObjectId("5fd931e00000000000000000")是创建了一个真正的ObjectId对象,而你之前的代码相当于查询_id大于这个字符串值,两者类型不同,MongoDB不会进行隐式转换,所以没有匹配结果。 - 动态生成ObjectId(如果需要):如果你的
timestamp参数是用来生成起始ObjectId的(比如从时间戳转换),可以用以下方式生成对应时间的ObjectId:// 假设timestamp是毫秒级时间戳字符串,先转为long long timestampLong = Long.parseLong(timestamp); ObjectId targetId = new ObjectId(timestampLong); - 构造注入优化:Spring 4.3及以上版本,当类只有一个构造方法时,Spring会自动注入依赖,所以可以去掉
@Autowired注解,让代码更简洁。
内容的提问来源于stack exchange,提问作者RideSVEL
相关产品推荐
相关产品推荐

