使用Node.js向Mongoose两个关联Schema插入数据及报错解决方法
错误原因
你定义的ownerSchema中shopPlace字段类型为Schema.Types.ObjectId,关联Shop集合,该字段只能存储已存在的Shop文档的_id值,直接传入完整的Shop对象会触发类型转换失败的报错。
正确实现方案
方案1:同时新增Shop和Owner(适合Shop还未入库的场景)
- 先修改后端插入逻辑,先保存Shop文档,再关联生成Owner文档:
// 先引入Shop模型 const Shop = require("../models/shopSchema"); const Owner = require("../models/ownerSchema"); const addTask = async (req, res) => { try { // 拆分请求参数中的店主信息和店铺信息 const { ShopPlace, ...ownerBaseInfo } = req.body; // 先保存店铺到数据库 const savedShop = await new Shop(ShopPlace).save(); // 把生成的店铺_id赋值给店主的shopPlace字段,再保存店主 const savedOwner = await new Owner({ ...ownerBaseInfo, shopPlace: savedShop._id }).save(); console.log("Added Successfully", savedOwner); // 可按需添加响应返回:res.json({ success: true, data: savedOwner }) } catch (err) { console.log(err); // 可按需添加错误响应:res.status(400).json({ success: false, msg: err.message }) } };
- Postman请求保持你现有格式即可,注意字段名大小写要和Schema匹配,如果Schema里是
shopPlace(首字母小写),请求里的key也要改成小写shopPlace,避免参数读取失败。
方案2:仅新增Owner(适合Shop已经提前入库的场景)
不需要修改你原有的单Schema插入逻辑,直接在Postman里传入已存在的Shop文档的_id即可,请求格式如下:
{ "fname" : "tom", "lname" : "Jerry", "shopPlace" : "已存在的Shop文档的_id字符串,可从MongoDB中查询获取" }
补充说明
如果后续查询Owner时需要同时带出关联的Shop完整信息,使用Mongoose的populate方法即可:
// 查询id为xxx的店主,同时关联返回对应的店铺信息 const ownerDetail = await Owner.findById("xxx").populate("shopPlace");
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

