如何在Mongoose中按Campaign获取关联Photo集合数据?
解决根据指定Campaign获取对应Photo的问题
看起来你当前的getGallery路由没有正确关联到目标Campaign,导致拉取了所有照片。咱们一步步修复这个问题:
1. 修正路由的参数获取与查询逻辑
你的画廊URL是/photocontestapp/awesome%20baby%20srija/gallery,其中awesome baby srija是Campaign的标题,所以首先需要从req.params中拿到这个标题,找到对应的Campaign文档,再用它的_id去筛选Photo集合的内容。
修改后的getGallery路由如下:
exports.getGallery = (req, res) => { // 第一步:通过URL中的标题找到对应的Campaign Campaign.findOne({ Campname: req.params.Title }, (err, campaign) => { if (err) { console.error(err); return res.status(500).send('服务器错误'); } if (!campaign) { return res.status(404).send('未找到对应的活动'); } // 第二步:用找到的Campaign的_id查询关联的照片 PhotoEntries.find( { CampaignId: campaign._id }, // 正确的查询条件:匹配Photo中的CampaignId ['Photo', 'Name', 'Description'], // 按需返回视图需要的字段,可根据需求调整 { sort: { _id: -1 } }, (err, photos) => { if (err) { console.error(err); return res.status(500).send('获取照片失败'); } res.render('admin/gallery', { photolist: photos }); } ); }); };
2. 修复字段名不匹配的隐藏bug
注意到你的Campaign模型里的标题字段是Campname,但在postEntriesCollection路由中你写的是Campaign.findOne({Title:req.params.Title})——这里存在字段名不匹配的问题!如果你的Campaign文档的标题存在Campname字段里,这个查询会找不到对应的Campaign,导致后续CampaignId赋值错误。
你需要统一字段名:要么把Campaign模型里的Campname改成Title,要么把查询条件改成{ Campname: req.params.Title },保证前后逻辑一致。
3. 确认路由参数配置正确
你的Express路由需要正确定义参数,才能让req.params.Title拿到URL中的活动标题,示例如下:
// 假设你的路由前缀是/photocontestapp router.get('/photocontestapp/:Title/gallery', yourController.getGallery);
这样修改后,就能精准拉取指定Campaign对应的所有照片,渲染到画廊页面了。
内容的提问来源于stack exchange,提问作者pralayasimha Yedida
相关产品推荐
相关产品推荐

