Spring Boot中MongoDB Template添加第二个$or查询报错如何解决?
错误原因
- MongoDB的BSON结构不允许同一层级出现重复的
$or字段,你之前写的Shell查询看起来运行正常,实际是后定义的$or覆盖了前一个,并没有实现你预期的两个$or条件同时生效的逻辑。 - Spring Data MongoDB做了前置校验,当你两次调用
query.addCriteria()添加$or条件时,就会触发重复字段的异常。
解决方法
你实际要实现的逻辑是State!="Created" 且 第一个$or条件成立 且 第二个$or条件成立,所以需要把两个$or作为独立条件用andOperator拼接后再加入查询,正确代码如下:
// 1. 定义第一个$or条件组 Criteria or1 = new Criteria().orOperator( Criteria.where("Type").is("36").and("SubType").is("01"), // 原逻辑里两个and条件完全重复,实际业务可按需删减 Criteria.where("Type").is("36").and("SubType").is("01") ); // 2. 定义第二个$or条件组 Criteria or2 = new Criteria().orOperator( Criteria.where("name").is("Peter").and("type").is("UW"), // 原逻辑里两个and条件完全重复,实际业务可按需删减 Criteria.where("name").is("Peter").and("type").is("UW") ); // 3. 把所有条件用and拼接后加入查询 Criteria allCriteria = Criteria.where("State").ne("Created") .andOperator(or1, or2); Query query = new Query(allCriteria);
以上代码生成的Mongo查询结构完全符合业务预期,不会再出现重复$or的报错。
内容的提问来源于stack exchange,提问作者Srikanth Janapati
相关产品推荐
相关产品推荐

