MongoDB如何按日期筛选指定时间段内完全可用的学生文档
筛选指定时间段内完全可用的学生(MongoDB查询方案)
需求核心
要找出在available_from到available_to时间段内完全无假期冲突的学生,本质是确保学生的假期区间与指定可用区间无任何重叠,满足以下任一条件即可:
- 学生假期在指定可用时间段开始前已结束(
vacation_end < available_from) - 学生假期在指定可用时间段结束后才开始(
vacation_start > available_to)
示例数据
你的学生文档结构如下:
[ { "_id": 1, "name": "Anna", "vacation_start": "2024-01-01", "vacation_end": "2024-01-03" }, { "_id": 2, "name": "Bob", "vacation_start": "2024-01-01", "vacation_end": "2024-01-05" }, { "_id": 3, "name": "Zenna", "vacation_start": "2024-02-02", "vacation_end": "2024-02-10" } ]
具体查询语句
当输入参数为available_from=2024-01-04、available_to=2024-02-02时,对应的MongoDB查询命令如下:
db.students.find({ $or: [ { vacation_end: { $lt: "2024-01-04" } }, { vacation_start: { $gt: "2024-02-02" } } ] })
结果说明
- Anna的假期结束于
2024-01-03,早于指定时间段起始日,符合条件被返回 - Bob的假期结束于
2024-01-05,与指定时间段重叠,被排除 - Zenna的假期起始日等于指定时间段结束日,不属于“结束后开始”,因此被排除
调整说明
- 若日期字段存储为
Date类型而非字符串,直接传入ISODate()对象即可,无需字符串转换 - 若业务允许“假期刚好在边界点开始/结束”算可用,可将操作符改为
$lte或$gte,根据需求调整
内容的提问来源于stack exchange,提问作者Zesshi
相关产品推荐
相关产品推荐

