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

如何给Spring Data MongoDB的Criteria.elemMatch()传递多条件?

在Spring Data MongoDB的Criteria API中使用elemMatch传递多条件

没问题,这其实很简单!Spring Data MongoDB的elemMatch方法支持传入一个包含多个条件的Criteria对象,你只需要把需要的条件通过and方法组合起来,就能实现和原生MongoDB查询完全一致的效果。

具体实现代码

首先准备好你的日期范围参数,然后构建嵌套的多条件Criteria,再传入elemMatch中:

// 初始化日期范围(可根据实际业务替换成你的日期生成逻辑)
Date startDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse("2018-01-01T14:04:34.447Z");
Date endDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse("2018-01-20T14:04:34.447Z");

// 构建针对booking数组元素的多条件Criteria
Criteria bookingSubCriteria = Criteria.where("status").is("STARTED")
    .and("updateDate").gte(startDate)
    .and("updateDate").lte(endDate);

// 外层Criteria使用elemMatch指定数组匹配规则
Criteria mainCriteria = Criteria.where("booking").elemMatch(bookingSubCriteria);

// 构建查询并执行
Query query = new Query(mainCriteria);
List<Inventory> result = mongoTemplate.find(query, Inventory.class);

简化写法(链式调用)

如果觉得拆分写太繁琐,也可以直接用链式调用合并逻辑,效果完全一致:

Date startDate = ...; // 你的开始日期
Date endDate = ...; // 你的结束日期

Query query = new Query(Criteria.where("booking").elemMatch(
    Criteria.where("status").is("STARTED")
        .and("updateDate").gte(startDate)
        .and("updateDate").lte(endDate)
));

List<Inventory> result = mongoTemplate.find(query, Inventory.class);

为什么这样可行?

这段代码对应的就是你给出的原生MongoDB查询:

db.inventory.find({"booking": { $elemMatch: { status: "STARTED",updateDate: { $gte: ISODate("2018-01-01T14:04:34.447Z"), $lte: ISODate("2018-01-20T14:04:34.447Z")}}}})

通过and方法组合的bookingSubCriteria会被转换成MongoDB的多条件匹配,elemMatch会确保booking数组中至少存在一个元素同时满足status = STARTED和updateDate在指定范围内这两个条件,完全符合你的业务需求。

内容的提问来源于stack exchange,提问作者doga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:53