Mongoose如何实现同字段不同值的计数统计(点赞点踩场景)
Mongoose 实现点赞、点踩数量统计
你可以通过以下两种常用方式实现需求:
方案1:聚合管道实现(推荐,大数据量性能更高)
通过MongoDB聚合管道的$group阶段搭配条件累加器,单次数据库查询即可同时拿到两个统计值,避免多次请求开销。
假设你的Mongoose模型命名为Feedback,对应存储反馈数据的集合,代码如下:
const getFeedbackStats = async () => { const stats = await Feedback.aggregate([ { $group: { _id: null, // 遍历文档,feedback为like时累加1,否则加0 likesCount: { $sum: { $cond: [{ $eq: ["$feedback", "like"] }, 1, 0] } }, // 遍历文档,feedback为dislike时累加1,否则加0 dislikesCount: { $sum: { $cond: [{ $eq: ["$feedback", "dislike"] }, 1, 0] } } } }, { // 移除默认返回的_id字段,输出结构和预期完全匹配 $project: { _id: 0, likesCount: 1, dislikesCount: 1 } } ]); // 集合无数据时返回默认0值,避免undefined return stats[0] || { likesCount: 0, dislikesCount: 0 }; }; // 调用示例 // 针对给出的测试数据,返回结果为 { likesCount: 3, dislikesCount: 2 } const result = await getFeedbackStats();
方案2:countDocuments 分别统计(写法简单易读)
如果项目数据量不大,可以用countDocuments分别统计两种反馈的数量,通过Promise.all并行发起请求减少总耗时:
const getFeedbackStats = async () => { const [likesCount, dislikesCount] = await Promise.all([ Feedback.countDocuments({ feedback: "like" }), Feedback.countDocuments({ feedback: "dislike" }) ]); return { likesCount, dislikesCount }; };
选型建议
- 单集合反馈数据量过万时优先选聚合方案,仅需单次扫描集合,性能约为双count方案的2倍
- 小型项目、数据量较小时两种方案均可使用,第二种写法理解成本更低,更易维护
内容的提问来源于stack exchange,提问作者DaMatt91
相关产品推荐
相关产品推荐

