如何用Mongoose Aggregate统计用户所有帖子的点赞总数
统计指定用户所有帖子的Likes总数量(Mongoose实现)
嘿,刚接触Mongoose的话,这种统计需求确实会有点懵,我给你两种实用的实现方案,你可以根据自己的场景选择:
方案一:用聚合管道(推荐,大数量场景更高效)
这种方法直接在数据库层面完成计算,不需要把所有帖子数据拉到后端再处理,数据量大的时候性能更好。
// 替换成你要统计的目标用户ID const targetUserId = "5f5b784209393b0638f896e2"; // 假设你的帖子模型叫Post,记得换成你实际的模型名 Post.aggregate([ // 第一步:筛选出该用户发布的所有帖子 { $match: { author: targetUserId } }, // 第二步:给每个帖子添加一个字段,存储该帖子的点赞数(likes数组的长度) { $addFields: { postLikeCount: { $size: "$likes" } } }, // 第三步:把所有帖子的点赞数累加,得到总数量 { $group: { _id: null, totalUserLikes: { $sum: "$postLikeCount" } } }, // 第四步:只返回总点赞数字段,去掉默认的_id { $project: { _id: 0, totalUserLikes: 1 } } ]) .then(aggregateResult => { // 处理用户没有任何帖子的情况 const totalLikes = aggregateResult.length > 0 ? aggregateResult[0].totalUserLikes : 0; console.log(`该用户所有帖子的总点赞数:${totalLikes}`); }) .catch(error => { console.error("统计过程出错:", error); });
方案二:先查询帖子再计算(直观易懂,适合小数据量)
如果你的帖子数量不多,这种方法更直观,新手更容易理解逻辑:
const targetUserId = "5f5b784209393b0638f896e2"; Post.find({ author: targetUserId }) .then(userPosts => { let totalLikes = 0; // 遍历所有帖子,累加每个帖子的点赞数 userPosts.forEach(post => { totalLikes += post.likes.length; }); console.log(`该用户所有帖子的总点赞数:${totalLikes}`); }) .catch(error => { console.error("查询出错:", error); });
小提示
- 记得把代码里的
Post替换成你自己定义的Mongoose帖子模型名称哦~ - 如果你的用户ID是从
User模型查询得到的,直接传入对应的_id值就可以了。
内容的提问来源于stack exchange,提问作者Pradeep Parmar
相关产品推荐
相关产品推荐

