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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:05:25