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

使用MongoTemplate配置多orOperator条件时无法添加第二个null条件如何解决

问题原因

报错是因为MongoDB的BSON文档不允许同一层级存在重复的$or字段,你原代码中当两个筛选条件同时生效时,相当于向查询顶层先后添加了两个独立的$or操作符,触发了Spring Data MongoDB的校验限制。

解决方案

核心思路是将所有筛选条件统一整合到顶层$and操作符下,避免同级出现重复的$or字段。同时可以优化状态筛选逻辑,用in操作替代手动拼接orOperator,简化代码。

修改后代码如下:

Query query = new Query().with(pageable);
List<Criteria> andCriteriaList = new ArrayList<>();

// 处理状态筛选
if (searchCriteria.getStatus() != null && searchCriteria.getStatus().length > 0) {
    // 多状态直接用in,无需手动写or,效果和原逻辑完全一致
    andCriteriaList.add(Criteria.where("status").in(searchCriteria.getStatus()));
}

// 处理文本搜索筛选
if (searchCriteria.getText() != null) {
    andCriteriaList.add(new Criteria().orOperator(
        Criteria.where("title").regex(searchCriteria.getText(), "i"),
        Criteria.where("description").regex(searchCriteria.getText(), "i"),
        Criteria.where("item.sku").is(searchCriteria.getText())
    ));
}

// 所有条件用and拼接后加入查询
if (!andCriteriaList.isEmpty()) {
    query.addCriteria(new Criteria().andOperator(andCriteriaList.toArray(new Criteria[0])));
}
逻辑说明
  • 所有独立的筛选条件都会作为$and的子项存在,两个$or分别属于$and下的不同子节点,不会出现同层级重复键的问题
  • 状态筛选用in实现多值匹配,兼容2个以上的状态值扩展,无需修改逻辑

内容的提问来源于stack exchange,提问作者David Anwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:54:05