You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:18:20