MongoDB能否用findOne类方法更新嵌套字段?嵌套字段保存失败如何解决?
在Mongoose中更新嵌套字段失效的解决办法
可以通过findById/findOne这类方法更新嵌套字段,但你遇到的问题是Mongoose默认无法自动检测到嵌套对象的变更,导致保存时嵌套属性的修改无法生效。你的代码示例:
const dbRecord = await SomeModel.findById(id); if (newVal !== dbRecord.someArray.oldValue) { dbRecord.someArray.oldValue = newValue; dbRecord.someArray.updateArray.push(new Date()) } // ...设置其他属性 dbRecord.save()
使用Mongoose 6.12.8版本时,其他属性能正常保存,但嵌套的someArray下的属性变更无法被持久化到数据库。
感谢@cmgchess提供的解决方案,核心是手动标记嵌套字段已修改,让Mongoose识别到变更并执行持久化:
doc.mixed.type = 'changed'; doc.markModified('mixed.type'); doc.save() // mixed.type的变更会被正常保存
对应到你的场景,只需在修改嵌套字段后,添加标记语句即可:
const dbRecord = await SomeModel.findById(id); if (newVal !== dbRecord.someArray.oldValue) { dbRecord.someArray.oldValue = newValue; dbRecord.someArray.updateArray.push(new Date()) // 手动标记嵌套字段已修改 dbRecord.markModified('someArray'); } // ...设置其他属性 dbRecord.save()
Mongoose的变更检测机制对顶层属性的修改敏感度较高,但对于嵌套对象(尤其是Schema未明确指定结构的混合类型字段),需要通过markModified方法指定变更的字段路径,才能让Mongoose将该字段的更新写入数据库。
内容的提问来源于stack exchange,提问作者alex351
相关产品推荐
相关产品推荐

