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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:06:45