编写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
相关产品推荐
相关产品推荐

