You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:48:16