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
相关产品推荐
相关产品推荐

