使用Mongoose查询选中月份任意日期在起止日期区间的记录
使用Mongoose查询覆盖指定月份的区间记录
核心查询逻辑
要筛选出指定月份内任意日期落在记录的startDate与endDate区间的记录,本质是判断记录的时间区间和目标月份是否存在重叠。只需满足两个条件:
- 记录的
startDate≤ 目标月份的最后一天 - 记录的
endDate≥ 目标月份的第一天
代码实现(日期字段为Date类型)
假设你的Mongoose模型已将startDate和endDate定义为Date类型(推荐存储方式),查询代码如下:
// 定义目标月份(示例:2024年11月,JavaScript月份从0开始,所以10对应11月) const targetYear = 2024; const targetMonth = 10; // 计算目标月份的起始和结束时间 const monthStart = new Date(targetYear, targetMonth, 1); // 当月第一天00:00:00 const monthEnd = new Date(targetYear, targetMonth + 1, 0, 23, 59, 59, 999); // 当月最后一天23:59:59.999 // 执行Mongoose查询 const matchingRecords = await YourModel.find({ $and: [ { startDate: { $lte: monthEnd } }, { endDate: { $gte: monthStart } } ] });
兼容字符串格式日期的查询
如果数据库中startDate和endDate以DD/MM/YYYY字符串存储,可通过$dateFromString转换后再比较:
const targetYear = 2024; const targetMonth = 10; const monthStart = new Date(targetYear, targetMonth, 1); const monthEnd = new Date(targetYear, targetMonth + 1, 0, 23, 59, 59, 999); const matchingRecords = await YourModel.find({ $expr: { $and: [ { $lte: [ { $dateFromString: { dateString: "$startDate", format: "%d/%m/%Y" } }, monthEnd ] }, { $gte: [ { $dateFromString: { dateString: "$endDate", format: "%d/%m/%Y" } }, monthStart ] } ] } });
示例验证
针对你提供的记录:
- Test 1:区间2020-11-01至2028-11-01,包含2024年11月,会被筛选出来
- Test 2:区间2018-07-22至2038-07-22,与2024年11月无重叠,不会被筛选
- Test 3:区间2005-05-14至2035-05-14,包含2024年11月,会被筛选出来
内容的提问来源于stack exchange,提问作者Vimal
相关产品推荐
相关产品推荐

