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

基于条件过滤的Mongoose聚合实现用户关联及平均评分计算

解决方案

你当前的代码没有完成过滤已删除反馈、关联User集合的逻辑,以下是可直接运行的完整聚合查询实现:

db.Recipe.aggregate([
  // 第一步:过滤feedBack中未删除的有效反馈
  {
    $addFields: {
      validFeedBack: {
        $filter: {
          input: "$feedBack",
          cond: { $eq: ["$$this.isDelete", false] }
        }
      }
    }
  },
  // 第二步:关联User集合查询所有有效反馈对应的用户信息
  {
    $lookup: {
      from: "User",
      localField: "validFeedBack.userId",
      foreignField: "id",
      as: "relatedUsers"
    }
  },
  // 第三步:构造返回的结果字段
  {
    $project: {
      // 构造带用户名的反馈详情数组
      feedbackDetails: {
        $map: {
          input: "$validFeedBack",
          as: "fb",
          in: {
            id: "$$fb.id",
            time: "$$fb.time",
            rating: "$$fb.rating",
            review: "$$fb.review",
            isDelete: "$$fb.isDelete",
            // 从关联到的用户列表中匹配对应用户名
            userName: {
              $getField: {
                input: { $first: { $filter: { input: "$relatedUsers", cond: { $eq: ["$$this.id", "$$fb.userId"] } } } },
                field: "name"
              }
            }
          }
        }
      },
      // 计算有效反馈的平均评分,没有有效反馈时返回0
      averageRating: {
        $cond: {
          if: { $gt: [{ $size: "$validFeedBack" }, 0] },
          then: { $avg: "$validFeedBack.rating" },
          else: 0
        }
      },
      // 不需要返回_id字段可以保留本行,需要返回则删除
      _id: 0
    }
  }
])

代码说明

  • 先通过$filter提前过滤掉isDelete为true的无效反馈,避免后续做无用的关联查询
  • 关联User集合时直接用所有有效反馈的userId批量查询,性能远高于逐行关联
  • 构造feedbackDetails时通过二次过滤匹配对应反馈的用户名,保证数据对应关系准确
  • 平均评分计算前先判断有效反馈长度,避免空数组计算时返回null的问题

内容的提问来源于stack exchange,提问作者Muhammad Yousuf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:15:01