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

MongoDB查询:获取会议时间数组与指定日期无重叠的用户

MongoDB查询:找出所有会议与指定区间无重叠的用户

嘿,我来帮你搞定这个查询需求。你要找的是那些所有会议都和2018-04-17T12:00:00.000Z到2018-04-17T15:00:00.000Z这个区间完全没交集的用户对吧?咱们一步步来拆解实现。

首先得明确无重叠的判断逻辑:一个会议和目标区间无重叠,要么是它在date1之前就结束了,要么是在date2之后才开始。而我们要的是用户的所有会议都满足这个条件——换句话说,就是用户的会议列表里不存在任何一个和目标区间有重叠的会议。

核心查询语句

用MongoDB的$not和$elemMatch就能精准实现这个需求:

db.users.find({
  meeting: {
    $not: {
      $elemMatch: {
        // 匹配所有和目标区间有重叠的会议
        start: { $lt: ISODate("2018-04-17T15:00:00.000Z") },
        end: { $gt: ISODate("2018-04-17T12:00:00.000Z") }
      }
    }
  }
})

逻辑拆解

  1. 重叠判定:$elemMatch里的条件是用来找单个会议是否和目标区间有交集——只要会议的开始时间早于date2,且结束时间晚于date1,就说明两个区间有重叠。
  2. 反向筛选:$not操作符会把所有包含这类重叠会议的用户排除掉,剩下的自然就是所有会议都和目标区间无重叠的用户。

边界情况补充

  • 如果某个会议的end刚好等于date1,或者start刚好等于date2,这个查询会判定为无重叠(毕竟没有时间交集)。要是你需要把这种边界情况也算成重叠,把操作符改成$lte和$gte就行。
  • 如果用户没有meeting字段或者会议数组是空的,这个查询会默认把这类用户也包含进来。要是只想保留有会议记录的用户,可以加个额外条件:
    db.users.find({
      meeting: {
        $exists: true,
        $ne: [],
        $not: {
          $elemMatch: {
            start: { $lt: ISODate("2018-04-17T15:00:00.000Z") },
            end: { $gt: ISODate("2018-04-17T12:00:00.000Z") }
          }
        }
      }
    })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:31:30