如何在Java中使用MongoOperations编写多条件查询Criteria
MongoDB Criteria 查询逻辑修正
问题背景
集合中的示例文档:
{"document" : "001", "requestType" : "A", "valid" : "true"}, {"document" : "002", "requestType" : "A", "valid" : "false"}, {"document" : "003", "requestType" : "B"}
文档规则:requestType和document为必填字段,valid为可选字段。
查询需求:
- 当
requestType为"A"时,必须满足valid属性为true - 其他
requestType的文档全部返回
预期查询结果:
{"document" : "001", "requestType" : "A", "valid" : "true"}, {"document" : "003", "requestType" : "B"}
错误的尝试代码
Criteria criteria = new Criteria(); //others criteria are there as well thats why used orOperator criteria.orOperator( Criteria.where("requestType").is("A"), Criteria.where("valid").is(true) ); final Query query = new Query(); query.addCriteria(criteria);
当前仅返回document:001,无法获取document:003。
正确解决方案
原代码的逻辑错误在于orOperator的条件组合,它实现的是"requestType为A 或者 valid为true",但我们需要的是**(requestType为A 且 valid为true) 或者 requestType不为A**。
正确的Criteria构建代码:
Criteria criteria = new Criteria(); criteria.orOperator( // 分支1:匹配requestType=A且valid=true的文档 Criteria.where("requestType").is("A").and("valid").is(true), // 分支2:匹配所有requestType不等于A的文档 Criteria.where("requestType").ne("A") ); final Query query = new Query(); query.addCriteria(criteria);
逻辑说明
- 第一个分支精准筛选
requestType="A"且valid=true的文档,排除requestType="A"但valid=false的无效数据 - 第二个分支匹配所有
requestType不是"A"的文档,不管该文档是否包含valid字段,完全符合需求
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

