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

编写MongoDB聚合查询关联Product与Profile集合并计算产品平均评分

MongoDB聚合查询:关联Product与Profile集合并获取产品平均评分

1. 集合结构与示例数据

Product集合

包含_id、name、postedBy三个字段,示例数据:

{
  "_id": "61eac83938ba2c41e626ac81", // MongoDB ID
  "name":"OLD AC", // 字符串类型
  "postedBy":"61c9a23dee9e923c1bf6d277" // MongoDB ID
}

Profile集合

包含_id、name、reviews数组字段,reviews元素包含rating、itemId等属性,示例数据:

{
  "_id": "61eac83938ba2c41e626ac81", // MongoDB ID
  "name":"rahul rj", // 字符串类型
  "reviews": [
      {
        "_id": "6280f9e5bd0ba79c387ee951",
        "rating": 2,
        "itemId": "61eac83938ba2c41e626ac81",
        "updatedAt": "2022-05-15T13:02:29.408Z",
        "createdAt": "2022-05-15T13:02:29.408Z"
      },
      {
        "_id": "6280f9e5bd0ba79c387ee951",
        "rating": 2,
        "itemId": "61eac83938ba2c41e626ac85",
        "updatedAt": "2022-05-15T13:02:29.408Z",
        "createdAt": "2022-05-15T13:02:29.408Z"
      }
  ]
}

2. 需求

编写MongoDB聚合查询,关联上述两个集合,在查询产品列表时获取对应产品的平均评分。

3. 实现查询

db.Product.aggregate([
  // 关联Profile集合,筛选当前产品的评论数据
  {
    $lookup: {
      from: "Profile",
      let: { productId: "$_id" },
      pipeline: [
        { $unwind: "$reviews" },
        { $match: { $expr: { $eq: ["$reviews.itemId", "$$productId"] } } },
        { $group: { _id: null, averageRating: { $avg: "$reviews.rating" } } },
        { $project: { averageRating: 1, _id: 0 } }
      ],
      as: "ratingData"
    }
  },
  // 提取平均评分,无评论时默认设为0
  {
    $addFields: {
      averageRating: {
        $ifNull: [ { $arrayElemAt: ["$ratingData.averageRating", 0] }, 0 ]
      }
    }
  },
  // 移除临时字段
  { $project: { ratingData: 0 } }
])

关键步骤说明

  • $lookup:通过自定义管道关联Profile集合,精准匹配当前产品的评论
  • $unwind:展开评论数组,为后续分组计算做准备
  • $match:仅保留与当前产品ID匹配的评论记录
  • $group:基于筛选后的评论计算平均评分
  • $addFields:将平均评分转为顶层字段,处理无评论的边界情况
  • $project:清理临时生成的冗余字段,简化输出结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:35:34