使用Node.js更新MongoDB中存在关联引用的Schema数据不生效如何解决
问题排查点
Schema定义错误
assigneeSchema.js中注册模型时参数错误,你写的是mongoose.model('Assignment', shopSchema),但你定义的Schema变量是assigneeSchema,shopSchema不存在,会直接报错导致模型初始化失败。关联关系理解错误
你在Project中配置的assignee是引用关联(ObjectId外键),不是内嵌文档,Project集合中只会存储Assignee文档的_id,不会存储assigneeName、grade这类字段,所以你构造的updateAssignee.assignee.assigneeName这种更新字段完全不生效。查询条件错误
- Project的Schema中没有定义
projectId字段,默认主键是_id,你用{ projectId: id }作为查询条件匹配不到任何文档,更新自然不生效。 - Assignee的Schema中也没有
projectId字段,你直接按projectId查询Assignee也匹配不到目标文档。
- Project的Schema中没有定义
异步方法调用错误
updateOne是Mongoose模型的静态方法,不需要加new关键字调用,加new只会创建一个无用的实例不会执行更新。- 你声明了
async函数,但没有给updateOne加await关键字,更新请求只是创建了Promise没有实际执行,函数就已经结束了。
更新字段构造错误
要更新Assignee文档的字段,直接构造{assigneeName: xx, grade: xx}即可,不需要加assignee.前缀,因为这些是Assignee自身的顶级字段。无响应返回
整个更新逻辑执行完后没有调用res.json()/res.send()给客户端返回结果,接口会一直超时。
修正后代码示例
首先修正assigneeSchema.js的错误:
// assigneeSchema.js 修正后 var assigneeSchema = Schema({ assigneeName : String, grade : String, startDate : Date, endDate : Date }); // 第二个参数改为正确的assigneeSchema var Assignee = mongoose.model('Assignment', assigneeSchema);
然后修正更新逻辑:
const update = async (req, res) => { try { const { id } = req.params; const updateProject = {}; const updateAssignee = {}; if (req.body.pname) updateProject.pname = req.body.pname; if (req.body.description) updateProject.description = req.body.description; if (req.body.assignee?.assigneeName) updateAssignee.assigneeName = req.body.assignee.assigneeName; if (req.body.assignee?.grade) updateAssignee.grade = req.body.assignee.grade; // 1. 先更新Project文档 await Project.updateOne( { _id: id }, // 用默认主键_id查询 { $set: updateProject }, { runValidators: true } ); // 2. 如果有要更新的assignee字段,先查Project对应的assigneeId,再更新Assignee if (Object.keys(updateAssignee).length > 0) { const project = await Project.findById(id).select('assignee'); if (project?.assignee) { await Assignee.updateOne( { _id: project.assignee }, // 用assignee的_id查询 { $set: updateAssignee }, { runValidators: true } ); } } // 返回响应 res.status(200).json({ code: 0, msg: '更新成功' }); } catch (err) { console.error('更新失败:', err); res.status(500).json({ code: 1, msg: '更新失败', error: err.message }); } };
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

