如何在MongoDB中编写子文档带多OR条件的Criteria查询
修正后的查询实现代码
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.time.LocalDate; // 主条件:isStatus为true Criteria statusCriteria = Criteria.where("isStatus").is(true); // OR分组:子文档effDate为当日 / localTimeStamp为空 / localTimeStamp为null / 字段不存在 Criteria orCriteria = new Criteria().orOperator( // 子文档数组匹配:至少有一个子文档effDate为当日 Criteria.where("childEntity").elemMatch(Criteria.where("effDate").is(LocalDate.now())), // localTimeStamp三种异常场景 Criteria.where("localTimeStamp").is(""), Criteria.where("localTimeStamp").isNull(), Criteria.where("localTimeStamp").exists(false) ); // 组装最终逻辑:主条件 AND 所有OR条件 Query query = new Query(new Criteria().andOperator(statusCriteria, orCriteria)); List<ParentEntity> list = mongoTemplate.find(query, ParentEntity.class);
核心改动说明
- 修正子文档字段拼写错误:原代码中
childentity和实体类属性名childEntity不匹配,同时使用elemMatch规范数组类型子文档的匹配逻辑,确保只要有一个子文档满足条件即可命中。 - 补全localTimeStamp的匹配场景:新增
isNull()匹配字段值为null的情况,新增exists(false)匹配字段不存在的情况,三个场景直接放入orOperator参数即可,OR运算符支持传入任意数量的并列条件。 - 优化逻辑嵌套结构:拆分独立的条件实例避免逻辑叠加错误,直接实现
isStatus=true AND (子文档匹配 OR 空串 OR null OR 字段不存在)的要求。
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

