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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:48:01