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

如何设置MongoDB路由访问嵌套对象?表单数组内问题对象无法访问

问题分析与解决方案

我看你是想从表单的questions数组里找到指定ID的问题对象,但当前代码有几个关键问题导致你没法正确访问目标对象:

1. 数组遍历方式不合适

你用了for (var i in form.questions),但for...in是用来遍历对象属性的,对于数组来说,用普通for循环、forEach或者更简洁的find方法会更安全、直观。

2. 对象与ID直接比较不成立

form.questions[i]是一个完整的问题对象,而request.params.q_id是字符串类型的ID,直接用==对比肯定不相等——你需要去比较问题对象的_id属性,还要注意MongoDB的ObjectId是对象类型,得转成字符串再和参数对比。

修正后的完整代码

router.route('/:post_id/:q_id')
.get(function (request, response) {
  forms.findById(request.params.post_id, function(error, form) {
    if (error) {
      return response.send({ error: error });
    }
    // 用find方法直接定位匹配的问题,代码更简洁
    const targetQuestion = form.questions.find(question => 
      question._id.toString() === request.params.q_id
    );
    if (!targetQuestion) {
      return response.send({ error: '指定问题不存在' });
    }
    response.send({ question: targetQuestion });
  });
});

额外提示

  • 如果你的questions数组里的_id本身就是字符串(不是MongoDB的ObjectId),可以去掉.toString()直接对比。
  • Array.find()会返回第一个匹配的元素,比手动循环遍历更高效易读。
  • 遇到错误或找不到目标时记得提前返回响应,避免后续不必要的代码执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:19