You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:11:07