Mongoose中使用updateOne $set仅更新todo嵌套对象指定字段问题
问题原因
你当前的代码是对todo字段整体赋值,执行更新时会直接覆盖原有完整的todo对象,仅保留你传入的两个子字段,其余字段会被清除。
解决方案
使用MongoDB的点表示法指定嵌套字段的更新路径,仅修改目标子字段,不会影响todo下的其余原有值:
let { t, i } = req.body.delitem; const updateSet = { [`todo.${t}`]: "", [`todo.${i}`]: "" }; await User.updateOne( { username: req.body.user }, { $set: updateSet } );
补充注意事项
如果你的todo下的子字段没有在Schema中全部显式定义,需要调整Schema配置避免Mongoose严格模式拦截动态字段更新:
const userSchema = new mongoose.Schema({ name: String, email: String, phone: Number, points: Number, todo: { type: Object, strict: false // 允许存储未预定义的子字段 } })
你也可以直接将todo的类型指定为mongoose.Schema.Types.Mixed,实现同样的动态字段存储效果。
内容的提问来源于stack exchange,提问作者chaos
相关产品推荐
相关产品推荐

