Mongoose更新文档无法添加新字段,如何强制添加该字段?
嘿,我之前也踩过这个一模一样的坑!你已经排查出是Schema的问题,那大概率是下面这几个常见的小疏忽,咱们一个个来捋:
先确认新字段在Schema里的定义完全正确
别笑,有时候真的会手滑写错字段名或者类型!比如你要加的是newOptionalField,可别写成newOptinalField(少个i)。正确的定义应该是这样的:const MySchema = new mongoose.Schema({ // 你的原有字段... newOptionalField: { type: String, required: false } // 明确标记为可选 });另外,一定要重启你的Node服务!Mongoose会缓存Schema,不重启的话,新增的字段根本不会被加载进去,自然没法更新。
检查Schema的
strict配置
Mongoose默认的strict值是true,这个设置是只允许保存Schema里定义过的字段——这本来是好事,但如果你之前手动把strict改成了'throw'或者其他更严格的模式,可能会阻止新增已定义的可选字段。你可以检查下Schema的初始化代码:// 确保strict配置是默认的true,或者明确设为true const MySchema = new mongoose.Schema( { /* 字段定义 */ }, { strict: true } );要是你设了
strict: false,虽然能存任何字段,但这不符合Schema的设计初衷,还是建议保持strict: true,同时确保新字段在Schema里正确定义。更新时加上
runValidators参数
就算Schema没问题,有时候findByIdAndUpdate默认不会运行字段验证,导致可选字段没被正确处理。你可以在第三个参数里加上runValidators: true:MyModel.findByIdAndUpdate( req.body.modelId, { $set: req.body }, { new: true, runValidators: true } // 开启验证,确保新字段被识别 )这个参数会让Mongoose在更新时检查字段规则,哪怕是可选字段,也会被正确添加到文档里。
既然你已经定位到是Schema的问题,先从前面两点入手排查,尤其是字段拼写和服务重启,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者nrgyzer

