Mongoose Aggregate查询忽略重复结果的问题求解
解决MongoDB聚合查询中保留每条评论记录的问题
嘿,我来帮你搞定这个问题~
首先咱们先拆解下你当前代码里的两个核心问题:
- 多余的
$unwind:你的rating是一个嵌套对象,不是数组,$unwind是用来拆分数组元素的,这一步不仅没用,还可能导致不必要的性能损耗; - 错误使用
$group:$group的核心作用是按指定字段分组合并记录,你把_id设为$rating,就会把所有评分内容相同的评论合并成一条——这就是为什么6条相同评分的记录只返回一条的原因,而你需要的是每条评论单独计算总分并保留。
正确的聚合查询方案
咱们只需要保留$match过滤餐厅,然后用$project来为每条评论单独计算总分/平均分,就能完美满足你的需求:
Review.aggregate([ // 过滤指定餐厅的评论,这部分你原来的逻辑是对的 { $match: { restaurantID: mongoose.Types.ObjectId(reviewData.restaurantid) } }, // 为每条评论计算总分和平均分,同时保留原始记录的关键信息 { $project: { _id: 1, // 可选:保留原始评论的ID,方便关联其他操作 rating: "$rating", // 保留原始评分详情 total_rating: { $add: ["$rating.food", "$rating.service", "$rating.value"] }, avg_rating: { $divide: [ { $add: ["$rating.food", "$rating.service", "$rating.value"] }, 3 ] } } } ], function(review_error, reviews) { // 这里处理返回的结果即可 })
结果验证
针对你提供的3条样本数据,这个查询会返回:
[ { "_id": ObjectId("5af3d804d0d09e18b098208f"), "rating": { "food": 5, "service": 5, "value": 5 }, "total_rating": 15, "avg_rating": 5 }, { "_id": ObjectId("5af3d817d0d09e18b0982090"), "rating": { "food": 5, "service": 5, "value": 5 }, "total_rating": 15, "avg_rating": 5 }, { "_id": ObjectId("5af3d89161cc0a0e60f0925d"), "rating": { "food": 4, "service": 5, "value": 4 }, "total_rating": 13, "avg_rating": 4.333333333333333 } ]
如果你想要完全匹配你给出的预期结果结构(用rating作为_id),只需要调整$project的字段即可:
{ $project: { _id: "$rating", total_rating: { $add: ["$rating.food", "$rating.service", "$rating.value"] } } }
这样返回的结果就和你预期的完全一致了。
内容的提问来源于stack exchange,提问作者Tri Nguyen
相关产品推荐
相关产品推荐

