Node.js下MongoDB Mongoose Schema存储数组类型值异常问题咨询
问题原因及修复方案
1. 核心问题:Schema字段类型定义错误
你当前ownerSchema中shopType的类型声明为String,Mongoose会自动过滤不符合字段类型定义的传入值,因此你提交的数组格式数据会被直接丢弃,无法存入数据库。
要支持存储字符串数组,需要将shopType的类型修改为[String],修改后的ownerSchema.js代码如下:
var ownerSchema = Schema({ ownerId : String, fname : String, lname : String, shopPlace : { type: Schema.Types.ObjectId, ref: 'Shop' }, // 原String类型改为字符串数组类型 shopType: [String] }); var Owner = mongoose.model('Owner', ownerSchema);
2. 次要问题:业务逻辑代码存在变量名错误和逻辑错误
你当前的业务代码存在两处可导致运行异常的问题:
- 创建Shop实例时变量名为
shopDetails,但后续赋值shopPlace时误用了不存在的shopDetail变量(少了末尾的s) - 最后执行保存操作时错误重复保存Shop实例,而非新创建的Owner实例
额外补充:你的shopSchema中_id声明为String类型,但ownerSchema中shopPlace的类型是Schema.Types.ObjectId,二者类型不匹配可能导致后续关联查询失败,建议根据业务需求统一类型。
修复后的业务逻辑代码如下:
const addTask = async (req, res) => { const { shopName, location } = req.body.shopPlace; const shopDetails = new Shop({ shopName, location, }); await shopDetails.save(); const { ownerId, fname, lname, shopType } = req.body; const ownerDetail = new Owner({ ownerId, fname, lname, shopType, // 修正变量名,使用已保存的shopDetails的_id shopPlace: shopDetails._id, }); // 修正保存对象,保存Owner实例 await ownerDetail.save(); // 补充返回响应逻辑,避免请求超时 res.status(200).json({msg: '保存成功', data: ownerDetail}) };
内容的提问来源于stack exchange,提问作者user16041868
相关产品推荐
相关产品推荐

