MongoDB数组日期范围多条件查询失效问题求解
MongoDB数组元素的日期范围交集匹配问题
目标文档结构
dataRanges: [ { "name":"dataRange_0", "range" : [ { "dateStart": "2000-01-01T00:00:00Z", "dateEnd": "2005-01-01T00:00:00Z" }, { "dateStart": "2010-01-01T00:00:00Z", "dateEnd": "2015-01-01T00:00:00Z" } ] }, { "name":"dataRange_1", "range" : [ { "dateStart": "2020-01-01T00:00:00Z", "dateEnd": "2025-01-01T00:00:00Z" } ] } ]
当前查询实现
通过MatchOperation结合MongoUtils.getAndCriteria(List<Criteria>),再调用MongoOperations.aggregate查询,目标是筛选出range数组中存在与指定Instant类型日期(dateStartFilter、dateEndFilter)有交集(包含边界)的dataRanges元素。
单独使用单个过滤器时逻辑有效:
// dateStart 过滤逻辑 if (dateStartFilterExists) where("range.dateEnd").gte(dateStartFilter); // dateEnd 过滤逻辑 if (dateEndFilterExists) where("range.dateStart").lte(dateEndFilter);
问题现象
同时使用dateStartFilter和dateEndFilter时出现误匹配:当设置dateStartFilter为"2006-01-01T00:00:00Z",dateEndFilter为"2009-01-01T00:00:00Z"时,本不应匹配的dataRange_0仍被返回。
原因分析
当前逻辑会跨range数组的不同元素进行条件匹配:
dateStartFilter(2006-01-01)小于dataRange_0中第二个range的dateEnd(2015-01-01),条件成立dateEndFilter(2009-01-01)大于dataRange_0中第一个range的dateStart(2000-01-01),条件成立
两个条件分别命中数组中不同元素,导致整体条件满足,返回了不符合预期的结果。
无效尝试
曾尝试用andOperator组合条件,但没有效果:
where("range.dateEnd").gte(dateStartFilter).andOperator(where("range.dateStart").lte(dateEndFilter));
疑问
如何让Criteria强制匹配range数组中的同一个元素?是否可以通过其他AggregationOperation解决该问题?
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

