使用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
相关产品推荐
相关产品推荐

