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

MongoDB如何检测所有存在时间重叠的事件?

在MongoDB中检测并列出重叠事件

一、对应MySQL逻辑:给每个事件标记冲突状态

原MySQL语句会给每条事件添加conflict字段,标记该事件是否和更早ID的事件存在重叠。在MongoDB中可以用聚合管道实现相同逻辑:

db.events.aggregate([
  // 关联自身集合,查找更早ID且时间重叠的事件
  {
    $lookup: {
      from: "events",
      let: { currentId: "$event_id", currentStart: "$start", currentEnd: "$end" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $lt: ["$event_id", "$$currentId"] },
                { $gt: ["$end", "$$currentStart"] },
                { $lt: ["$start", "$$currentEnd"] }
              ]
            }
          }
        }
      ],
      as: "conflicting_events"
    }
  },
  // 添加conflict字段,判断是否存在重叠事件
  {
    $addFields: {
      conflict: { $gt: [{ $size: "$conflicting_events" }, 0] }
    }
  },
  // 可选:保留需要的字段,去掉关联结果数组
  {
    $project: {
      event_id: 1,
      start: 1,
      end: 1,
      note: 1,
      conflict: 1
    }
  }
])

这段逻辑会给每条事件返回conflict字段,值为true表示该事件和更早ID的事件存在重叠。


二、获取所有受影响的重叠事件(示例中的1、2、4、5)

要找出所有和其他事件存在重叠的事件(无论ID先后),可以调整聚合逻辑:

db.events.aggregate([
  {
    $lookup: {
      from: "events",
      let: { currentId: "$event_id", currentStart: "$start", currentEnd: "$end" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $ne: ["$event_id", "$$currentId"] },
                { $gt: ["$end", "$$currentStart"] },
                { $lt: ["$start", "$$currentEnd"] }
              ]
            }
          }
        }
      ],
      as: "conflicting_events"
    }
  },
  // 过滤出存在重叠的事件
  {
    $match: {
      $expr: { $gt: [{ $size: "$conflicting_events" }, 0] }
    }
  },
  // 可选:只保留ID等核心字段
  {
    $project: {
      event_id: 1,
      _id: 0
    }
  }
])

执行后会返回所有涉及重叠的事件ID,对应示例中的1、2、4、5。


三、获取引发重叠的最高ID事件(示例中的4、5)

对应原MySQL逻辑,只需要找出那些conflict为true的事件,也就是和更早ID事件重叠的新事件:

db.events.aggregate([
  {
    $lookup: {
      from: "events",
      let: { currentId: "$event_id", currentStart: "$start", currentEnd: "$end" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $lt: ["$event_id", "$$currentId"] },
                { $gt: ["$end", "$$currentStart"] },
                { $lt: ["$start", "$$currentEnd"] }
              ]
            }
          }
        }
      ],
      as: "conflicting_events"
    }
  },
  {
    $addFields: {
      conflict: { $gt: [{ $size: "$conflicting_events" }, 0] }
    }
  },
  {
    $match: { conflict: true }
  },
  {
    $project: {
      event_id: 1,
      _id: 0
    }
  }
])

执行后会返回示例中的4、5这类引发重叠的高ID事件。

注:上述代码中假设集合名为events,事件ID字段为event_id,时间字段为start和end(存储为MongoDB的Date类型),可根据实际集合结构调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:51:00