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

Mongoose嵌套对象加载异常:qn字段重复插入问题求助

问题解决:Mongoose存储问卷数据时qn重复的问题

你的核心问题是循环逻辑错误:内层循环每处理一个选项就创建一个带qn的新question对象并推入mcq数组,导致每个选项对应一条qn记录。正确的逻辑应该是每个问题对应一个question对象,其options数组包含该问题的所有选项。

以下是修正后的代码及说明:

修正后的userProject.js路由代码

router.post('/notification/check/upload/survey', async (req, res) => {
  const mcq = [];

  console.log(req.body);

  // 遍历每一条问卷问题
  for (let i = 0; i < req.body.questions.length; i++) {
    // 先创建当前问题的基础结构:qn + 空options数组
    const questionItem = {
      qn: req.body.questions[i].qn,
      options: []
    };

    // 遍历当前问题的所有选项,逐个添加到options数组
    for (let j = 0; j < req.body.questions[i].options.length; j++) {
      questionItem.options.push({
        option: req.body.questions[i].options[j].option,
        totalViews: req.body.questions[i].options[j].totalValues // 注意字段名对齐:模型定义的是totalViews,前端传的是totalValues
      });
    }

    // 将完整的单条问题对象推入mcq数组
    mcq.push(questionItem);
  }

  const check = new userCampaignSurvey({
    userId: req.body.userId,
    status: 'Pending',
    notification_type: req.body.notification_type,
    questions: mcq
  });

  check.save((err, p) => {
    if (err) {
      return res.status(500).send(err);
    }
    res.status(201).send(p);
  });
});

关键修改点

  1. 调整循环逻辑:外层循环先为每个问题创建独立的对象,内层循环仅负责填充该问题的options数组,而非重复创建带qn的新对象
  2. 字段名对齐:修正了前端传入的totalValues与模型定义的totalViews的字段名差异,确保数据能正确映射存储

修改后,存储的结果会和你的预期一致:每个qn对应一条question记录,其options数组包含该问题的所有选项。

内容的提问来源于stack exchange,提问作者akm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:40:24