Mongoose Schema默认值修改不生效,如何更新Schema配置
问题分析与解决方案
核心问题1:默认值函数调用方式错误
你当前写的default: constructDate()是在Schema定义时就立即执行了函数,相当于把Schema创建那一刻的日期字符串硬编码成了固定默认值,而非每次创建文档时动态生成。另外你返回的是字符串类型,虽然Mongoose会尝试转换为Date,但这不是标准写法,容易出问题。
核心问题2:Mongoose模型缓存未更新
你用了mongoose.models.Script || mongoose.model('Script', scriptsSchema)的写法,如果服务之前启动过,旧模型已经被缓存到mongoose.models中,即使修改了Schema,代码仍会复用缓存的旧模型,这就是删除集合也无效的原因。
修复步骤
1. 修正默认值函数写法
把函数引用传给default(不要加括号执行),并且直接返回仅保留日期部分的Date对象:
const constructDate = () => { const today = new Date(); // 将时间部分重置为00:00:00,只保留日期 today.setHours(0, 0, 0, 0); return today; }; const scriptsSchema = mongoose.Schema({ title: { type: String, require: true }, updated: { type: Date, default: constructDate, // 仅传递函数引用,不执行 require: true } });
2. 清除Mongoose模型缓存(开发环境)
修改模型导出代码,强制删除旧缓存后再创建新模型:
// 先删除缓存的旧模型(如果存在) if (mongoose.models.Script) { delete mongoose.models.Script; } // 重新创建并导出新模型 const Script = mongoose.model('Script', scriptsSchema); export default Script;
3. 重启服务并清空集合
- 关闭Node.js服务后重新启动,确保加载新的Schema与模型。
- 清空数据库中的
scripts集合(或直接删除数据库重建)。
完成以上步骤后,创建新Script文档时,updated字段就会自动设置为当天0点的日期,不再包含时间部分。
内容的提问来源于stack exchange,提问作者nicase
相关产品推荐
相关产品推荐

