如何编写MongoDB查询从关联reviews集合计算各电脑的平均评分
MongoDB查询产品对应关联评价平均评分方案
你可以使用MongoDB的聚合管道结合$lookup关联查询实现需求,完整查询语句如下:
db.computers.aggregate([ // 关联reviews集合,拉取当前产品对应的所有评价详情 { $lookup: { from: "reviews", localField: "reviews", foreignField: "_id", as: "review_list" } }, // 格式化输出字段,计算平均评分并保留1位小数 { $project: { _id: 0, name: 1, "Average rating": { $round: [ { $avg: "$review_list.rating" }, 1 ] } } } ])
各阶段说明
$lookup阶段:将computers集合每条数据的reviews字段(存储评价ID数组)和reviews集合的_id字段匹配,匹配到的所有评价文档会存入新增的review_list数组中$project阶段:指定返回字段,隐藏默认的_id字段,保留产品名称name;通过$avg运算符计算review_list中所有评价的rating字段平均值,再通过$round保留1位小数,和你示例的输出格式对齐
输出示例
运行上述查询后返回结果如下:
[ { "name": "Gaming PC", "Average rating": 4.3 }, { "name": "Office PC", "Average rating": 1.0 }, { "name": "Chromebook", "Average rating": 4.0 } ]
如果你需要直接返回name: "Gaming PC", Average rating: 4.3格式的字符串,可以在聚合管道中新增拼接字段的阶段:
db.computers.aggregate([ { $lookup: { from: "reviews", localField: "reviews", foreignField: "_id", as: "review_list" } }, { $project: { _id: 0, output: { $concat: [ "name: \"", "$name", "\", Average rating: ", { $toString: { $round: [ { $avg: "$review_list.rating" }, 1 ] } } ] } } } ])
内容的提问来源于stack exchange,提问作者JackWeir
相关产品推荐
相关产品推荐

