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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:47:31