如何在Node.js的MongoDB中按日期查询Calendar模型?
MongoDB Calendar 文档查询方案
一、优先方案:将日期字段改为Date类型(高效且可靠)
你当前的Schema里start/end/endDate都是String类型,字符串日期不仅无法利用MongoDB的日期索引,还可能因格式问题导致比较逻辑错误。推荐先修改Schema,把日期字段改为Date类型:
const calendarSchema = new Schema ({ title: String, start: Date, // 替换原String类型为Date end: Date, endDate: Date, sessionsRan: Number, _user: {type: Schema.Types.ObjectId, ref: 'User' }, created: { type: Date, default: Date.now }, isActive: String // 补充你使用的isActive字段(原Schema未定义,需确保存在) })
修改后,直接用MongoDB的日期操作符查询即可。首先获取今天的起始时间(当天00:00:00),再结合$lt(小于)操作符筛选:
// 生成今天0点的Date对象 const todayStart = new Date(); todayStart.setHours(0, 0, 0, 0); // 假设筛选endDate小于今天的文档,可替换为start/end字段 const calendars = await Calendar.find({ isActive: "active", endDate: { $lt: todayStart } });
如果需要筛选"小于等于今天"的文档,把$lt换成$lte即可。
二、不修改Schema的临时方案(需日期字符串为标准格式)
如果暂时无法修改Schema,你的日期字符串必须是YYYY-MM-DD或YYYY-MM-DDTHH:mm:ss这类可按字符顺序正确排序的格式。此时可以把今天转为对应格式的字符串,再用$lt比较:
// 生成今天的YYYY-MM-DD格式字符串 const todayStr = new Date().toISOString().split('T')[0]; // 筛选endDate小于今天的文档 const calendars = await Calendar.find({ isActive: "active", endDate: { $lt: todayStr } });
⚠️ 注意:如果你的日期字符串是MM/DD/YYYY这类非标准格式,字符串比较逻辑会和实际日期逻辑冲突(比如12/01/2023会被判定为大于01/01/2024),这种情况下必须修改字段类型才能正确查询。
内容的提问来源于stack exchange,提问作者KingJoeffrey
相关产品推荐
相关产品推荐

