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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:36:02