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

Mongoose Aggregate查询忽略重复结果的问题求解

解决MongoDB聚合查询中保留每条评论记录的问题

嘿,我来帮你搞定这个问题~

首先咱们先拆解下你当前代码里的两个核心问题:

  1. 多余的$unwind:你的rating是一个嵌套对象,不是数组,$unwind是用来拆分数组元素的,这一步不仅没用,还可能导致不必要的性能损耗;
  2. 错误使用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:13