Mongoose如何通过名称参数更新dist_id等关联引用类型字段
你代码运行不生效的核心原因是参数取值路径错误:你提交的formdata里district_name和company_name是req.body下的直接属性,但你原有代码是从req.body.localbody_company.company_name、req.body.dist_id.district_name嵌套路径取值,根本拿不到对应值,后续关联表查询为空就会导致字段赋值失败,更新自然不生效。
同时建议补充空值校验逻辑,避免查询不到关联数据时抛出非预期错误,也不要直接把整个req.body传入更新方法,防止前端传入非法字段篡改数据,修复后的代码如下:
updateLocalbody = (req) => { return new Promise(async (resolve, reject) => { try { // 直接从req.body顶层获取表单提交的两个名称参数 const { company_name, district_name } = req.body; // 查询公司关联ID,添加空值判断 const company = await models.Company.findOne({ company_name }); if (!company) { return reject({ message: "不存在匹配的公司记录" }); } // 查询区域关联ID,添加空值判断 const district = await models.District.findOne({ district_name }); if (!district) { return reject({ message: "不存在匹配的区域记录" }); } // 构造更新数据,显式指定要更新的字段 const updateParams = { dist_id: district._id, localbody_company: company._id // 如果有其他合法可更新字段,可以在此处追加 }; // 执行更新,新增runValidators参数保证schema字段校验生效 const updateResult = await models.LocalbodyName.findByIdAndUpdate( req.params.localbody_Id, updateParams, { new: true, runValidators: true } ); if (!updateResult) { return reject({ message: "未找到要更新的localbody记录" }); } resolve(updateResult); } catch (err) { console.log(err); reject({ message: err.message }); } }); };
其他可选优化点:
- 如果需要同时更新req.body里的其他字段,你可以先解构出所有合法字段再和两个关联ID合并
- 可给两个关联表的
company_name、district_name字段加索引,提升查询速度
内容的提问来源于stack exchange,提问作者Dilshana
相关产品推荐
相关产品推荐

