Mongo Java驱动升级:新版如何实现QueryBuilder的and/or查询逻辑
Mongo Java驱动升级QueryBuilder适配方案
问题场景
将旧版Mongo Java驱动v1升级至3.12.11版本搭配Spring Data MongoDB 3.4.1使用时,原有基于QueryBuilder构造的and/or组合查询代码无法编译,已知DBCollection、DBObject、findOne的基础替换规则,但缺少QueryBuilder对应的新版API实现方案。
项目引入依赖
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.11</version> </dependency>
原有编译失败的业务代码
@Override public String getSubTypeName(String flowerId, Integer subTypeId) { DBCollection collection = mongoTemplate.getCollection("flowers"); QueryBuilder query = new QueryBuilder(); query.and("configType").is("FLOWER_SUB_TYPE") .and("parentConfig").is(flowerId) .and("configKey").is(subTypeId) .or( QueryBuilder.start("isDeleted").is(false).get(), QueryBuilder.start("isDeleted").exists(false).get() ); DBObject flowerName = collection.findOne(query.get()); if(flowerName ==null || !flowerName.containsField("value")) return "empty"; else return (String) flowerName.get("value); }
原代码查询逻辑:查询configType为FLOWER_SUB_TYPE、parentConfig匹配传入flowerId、configKey匹配传入subTypeId,且isDeleted字段为false或不存在的记录,取记录的value字段返回。
适配方案
新版Mongo Java驱动提供Filters静态工具类构造所有查询条件,完全覆盖旧版QueryBuilder的能力,核心API对应关系如下:
- 等值匹配:旧版
query.and(key).is(value)对应Filters.eq(key, value) - 多条件AND组合:将所有需要同时满足的条件传入
Filters.and() - 多条件OR组合:将所有满足任意一个即可的条件传入
Filters.or() - 字段存在性判断:旧版
QueryBuilder.start(key).exists(false)对应Filters.exists(key, false)
适配完成的可运行代码如下:
@Override public String getSubTypeName(String flowerId, Integer subTypeId) { MongoCollection<Document> collection = mongoTemplate.getCollection("flowers"); Bson query = Filters.and( Filters.eq("configType", "FLOWER_SUB_TYPE"), Filters.eq("parentConfig", flowerId), Filters.eq("configKey", subTypeId), Filters.or( Filters.eq("isDeleted", false), Filters.exists("isDeleted", false) ) ); Document flowerName = collection.find(query).first(); if(flowerName == null || !flowerName.containsKey("value")) { return "empty"; } return flowerName.getString("value"); }
适配注意事项
Filters构造的所有查询条件均为Bson类型,可直接传入find()、updateMany()等MongoCollection方法,不需要像旧版QueryBuilder一样调用get()方法转换- Document类提供类型化get方法(如
getString()、getInteger()),直接调用即可避免手动强转的类型安全风险 - 判断Document中是否存在指定字段,使用
containsKey()方法替代旧版DBObject的containsField()
内容的提问来源于stack exchange,提问作者JavaSheriff
相关产品推荐
相关产品推荐

