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

如何在MongoDB文档更新时将createdAt字段设为当前日期?(React+Mongoose)

解决方法:更新MongoDB文档的createdAt字段

问题原因

当Mongoose模型启用{ timestamps: true }时,框架会自动管理createdAt和updatedAt字段:createdAt仅在文档创建时赋值,默认不允许后续更新操作覆盖该字段,所以前端传递的createdAt值会被Mongoose忽略。

方案1:修改Schema允许编辑createdAt

显式在Schema中定义createdAt字段,覆盖默认的只读行为:

const postSchema = new mongoose.Schema({
  // 其他现有字段,比如postedBy
  postedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
}, {
  timestamps: true,
  // 显式定义createdAt,允许修改
  createdAt: { type: Date, default: Date.now }
});

const Post = mongoose.model('Post', postSchema);

修改后,后端的findOneAndUpdate使用$set就能正常更新createdAt字段。

方案2:后端生成日期(推荐)

不要依赖前端时钟,直接在后端生成当前时间,避免客户端时间不一致的问题:

// 前端无需传递createdAt字段
// 后端处理:
const updatedData = {
  ...req.body,
  createdAt: new Date() // 服务端生成当前时间
};

Post.findOneAndUpdate(
  { _id: new Types.ObjectId(id), postedBy: user },
  { $set: updatedData },
  { new: true }
);

方案3:临时关闭严格模式(不推荐)

如果不想修改Schema,可以在更新时关闭Mongoose的严格模式,允许写入未在Schema中显式定义的字段(但会绕过验证,风险较高):

Post.findOneAndUpdate(
  { _id: new Types.ObjectId(id), postedBy: user },
  { $set: updatedData },
  { new: true, strict: false }
);

内容的提问来源于stack exchange,提问作者asela daskon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:04:56