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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:57:03