MERN栈项目中如何使用Mongoose聚合统计MongoDB电影评分总和
解决方案
你需要使用MongoDB聚合管道的三个核心阶段即可实现需求,如果你不需要额外过滤数据,$match 操作符可以省略。
完整聚合代码示例
假设你的Mongoose模型名为 UserMovieVote,调用聚合的代码如下:
const getMovieRankingSummary = async () => { return await UserMovieVote.aggregate([ // 可选:如果需要过滤特定条件的投票数据,在最前面加$match阶段 // { $match: { /* 过滤条件,比如仅统计2024年之后的投票 */ } }, // 拆分movies数组,将每个电影项转为独立的单条文档 { $unwind: "$movies" }, // 按电影维度分组,累加评分 { $group: { // 推荐按电影_id分组避免重名电影统计错误,如果确定title唯一也可以用 "$movies.title" _id: "$movies._id", title: { $first: "$movies.title" }, ranking: { $sum: "$movies.ranking" } } }, // 调整输出字段,和你要求的返回格式对齐 { $project: { _id: 0, title: 1, ranking: 1 } } ]) }
阶段说明
$unwind:把每个用户文档中的movies数组拆平,数组中的每一个电影对象都会生成一条独立的文档,为后续分组求和做准备$group:以电影的唯一标识为分组基准,用$sum累加所有分组内的电影评分,同时用$first提取当前分组对应的电影标题$project:隐藏不需要返回的_id字段,输出你要求的title和ranking字段结构
如果你不需要避免重名问题,直接按title分组,将$group阶段修改为下方代码即可:
{ $group: { _id: "$movies.title", ranking: { $sum: "$movies.ranking" } } }
内容的提问来源于stack exchange,提问作者TeflonTrout
相关产品推荐
相关产品推荐

