如何设置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
相关产品推荐
相关产品推荐

