如何给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
相关产品推荐
相关产品推荐

