如何在Express.js的Mongoose中正确插入含尺寸价格的对象数组?
问题描述
我在插入包含基础信息及不同尺寸对应价格的产品数据时,其他字段均可正常存入MongoDB,但尺寸与价格的对象数组无法正确存储。以下是相关代码与存储结果,希望得到映射req.body.pro数组的解决方案。
Product Schema
const productSchema = new mongoose.Schema({ product_name: {type:String, required: true}, product_desc: {type: String, required:true}, prod_cat: {type: mongoose.Schema.Types.ObjectId,ref: 'Category'}, prod_img: {type: String}, pro_price: [{ prod_size: {type: String,}, prod_price: {type: String} }] },{timestamps: true}) const prodSchema = mongoose.model('Product',productSchema)
postProduct控制器代码
async postProduct(req,res){ try{ const newProduct = new prodSchema({ product_name: req.body.productName, product_desc: req.body.productDetails, prod_cat: req.body.category, pro_price: req.body.pro }) console.log(newProduct); const addProduct = newProduct.save() } catch(err){ console.log(err); } }
前端提交的数据格式
{ productName: '玛格丽特披萨', productDetails: '搭配洋葱、蒜酱、肉片、白酱', category: '63221514e6b0279b001b9187', pro: [ { size: '中份', price: '750' }, { size: '大份', price: '900' }, { size: '小份', price: '500' } ] }
MongoDB实际存储结果
{"_id":{"$oid":"632372b5c1d5d998a2db49ae"},"product_name":"玛格丽特披萨","product_desc":"搭配洋葱、蒜酱、肉片、白酱","prod_cat":{"$oid":"63221619fc117e0cee38d855"},"pro_price":[{"_id":{"$oid":"632372b5c1d5d998a2db49af"}},{"_id":{"$oid":"632372b5c1d5d998a2db49b0"}},{"_id":{"$oid":"632372b5c1d5d998a2db49b1"}}],"createdAt":{"$date":{"$numberLong":"1663267509614"}},"updatedAt":{"$date":{"$numberLong":"1663267509614"}},"__v":{"$numberInt":"0"}}
解决方案
问题核心是字段名不匹配:Schema中pro_price数组的子字段是prod_size和prod_price,但前端传入的是size和price,Mongoose无法识别这些未定义的字段,因此仅生成了子文档的_id,未存储尺寸和价格数据。
只需将前端传入的数组做字段映射,修改控制器代码如下:
async postProduct(req,res){ try{ // 映射前端字段到Schema要求的字段名 const mappedProPrices = req.body.pro.map(item => ({ prod_size: item.size, prod_price: item.price })) const newProduct = new prodSchema({ product_name: req.body.productName, product_desc: req.body.productDetails, prod_cat: req.body.category, pro_price: mappedProPrices }) console.log(newProduct); await newProduct.save() // 添加await确保保存操作完成 res.status(201).json({message: '产品创建成功', product: newProduct}) } catch(err){ console.log(err); res.status(500).json({error: err.message}) } }
修改后,前端的size和price会被正确映射为Schema要求的字段,存入MongoDB后就能看到完整的尺寸与价格数据。另外注意原代码中save()未加await,会导致代码不等待保存完成就继续执行,建议添加await并补充响应返回,让请求有明确的结果反馈。
内容的提问来源于stack exchange,提问作者abrar
相关产品推荐
相关产品推荐

