Mongoose关联Comment Schema到数组后populate查询返回undefined求助
Mongoose双向关联查询中出现undefined的问题排查
我帮你梳理下导致comment._beer输出undefined的几个关键问题:
未完成评论与啤酒的双向关联绑定
你当前只完成了Comment文档的保存,但没有把新生成的评论ID添加到对应Beer的comments数组中。Mongoose不会自动维护这种双向关联,必须手动更新Beer文档。修改保存评论的代码如下:const newComment = new Comment({ _beer: req.params.id, comment: 'comm1', // _user: req.user.id }); newComment.save(function(err, savedComment) { if(err) return handleError(err); // 将评论ID追加到对应啤酒的comments数组 Beer.findByIdAndUpdate( req.params.id, { $push: { comments: savedComment._id } }, { new: true }, // 返回更新后的啤酒文档 function(err, updatedBeer) { if(err) return handleError(err); console.log('评论已保存,啤酒关联已更新'); } ); });查询回调的变量命名错误,导致字段访问逻辑混乱
你执行Beer.findOne(...).populate('comments')后,回调函数里的参数comment其实是查询到的Beer对象,而非Comment对象!Beer文档本身没有_beer字段,所以访问comment._beer必然返回undefined。正确的写法应该是:Beer.findOne({name:'newName'}) .populate('comments') .exec(function(err, beer) { if(err) return handleError(err); // 遍历已填充的comments数组,访问每个评论的_beer字段 beer.comments.forEach(commentItem => { console.log('该评论所属啤酒ID:%s', commentItem._beer); }); // 也可以打印整个啤酒对象,验证comments是否被正确填充 console.log('包含评论的啤酒信息:', beer); });额外校验:Model名称的一致性
确认你的Beer Model定义时使用的名称是'beers'(与Comment Schema中_beer的ref值一致),即:mongoose.model('beers', beerSchema);你当前Comment Model的名称
'comments'与Beer Schema中comments的ref值一致,这部分是正确的,但要注意拼写大小写(Mongoose默认会将Model名称转为复数小写作为集合名,所以尽量保持统一)。
内容的提问来源于stack exchange,提问作者Dave_888
相关产品推荐
相关产品推荐

