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") } } } } })
逻辑拆解
- 重叠判定:
$elemMatch里的条件是用来找单个会议是否和目标区间有交集——只要会议的开始时间早于date2,且结束时间晚于date1,就说明两个区间有重叠。 - 反向筛选:
$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
相关产品推荐
相关产品推荐

