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

如何在MongoDB中查询重叠日期时间区间的数据

正确的MongoDB时间段重叠查询实现

原查询的问题分析

  1. 语法错误:查询对象中直接嵌套{"key":"2"}是无效语法,MongoDB查询条件的顶层键值对默认是逻辑与(AND)关系,无需额外嵌套。
  2. 重叠逻辑不完整:原$or条件只覆盖了start_date落在查询区间内、end_date落在查询区间内两种情况,漏掉了文档时间段完全包含查询区间、或文档时间段部分覆盖查询区间的其他重叠场景。

正确的时间段重叠判断逻辑

两个时间段(文档的[start_date, end_date]和查询的[queryStart, queryEnd])重叠的核心条件是:

文档的开始时间 ≤ 查询的结束时间 且 文档的结束时间 ≥ 查询的开始时间

这个条件可以覆盖所有重叠场景:

  • 文档时间段完全包含查询时间段
  • 查询时间段完全包含文档时间段
  • 文档开始在查询区间内、结束在区间外
  • 文档结束在查询区间内、开始在区间外

正确的查询语句

假设你需要同时过滤key="2"的文档,完整查询语句如下:

const queryStart = "2023-01-04T04:30:00.000Z";
const queryEnd = "2023-01-04T05:00:00.000Z";

db.collection.find({
  key: "2",
  start_date: { $lte: queryEnd },
  end_date: { $gte: queryStart }
})

结果说明

注:你提供的示例数据中key="2"的文档时间段为2023-01-03的03:30-05:30,与查询的2023-01-04时间段无重叠;若期望结果中的key="2"文档是输入笔误,实际应为key="1"且时间段为2023-01-04的03:30-05:30的文档,上述查询会正确返回该目标文档。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:05:38