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

MongoDB更新报错:无法修改不可变字段_id的问题排查

解决方法:

1. 修复DAO层的语法错误

你的updateUser函数存在语法错误:updateOne的两个参数被错误地用逗号分隔在函数调用外部,导致第二个更新参数根本没有传入updateOne方法。正确写法是将两个参数放在updateOne的括号内:

export const updateUser = async (uid, userUpdates) => {
  await usersModel.updateOne({ _id: uid }, { $set: userUpdates });
};

这个错误本身虽不会直接触发_id修改报错,但会引发其他异常,必须优先修复。

2. 排查并移除更新对象中的_id字段

即使请求体里没有_id,也可能存在以下情况导致更新对象包含_id:

  • 中间件(如body解析或自定义处理逻辑)自动给req.body添加了_id字段
  • Mongoose模型的前置钩子(pre('update')等)意外注入了_id
  • 代码中不小心将uid赋值到了更新对象中

解决方法是在执行更新前主动删除_id字段:

// 在DAO层处理
export const updateUser = async (uid, userUpdates) => {
  // 删除可能存在的_id字段
  delete userUpdates._id;
  await usersModel.updateOne({ _id: uid }, { $set: userUpdates });
};

3. 确保使用$set操作符

你已经正确使用了$set操作符——如果直接将整个对象作为更新参数(而非包裹在$set中),Mongoose会替换整个文档,若此时对象中存在_id就会触发不可修改报错。保持使用$set仅更新指定字段即可避免此类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:30:50