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

MongoDB如何聚合分组统计子文档中up/down投票总数?

MongoDB投票统计解决方案

当然可以通过aggregate操作实现你的需求。由于你的votes字段是动态键值对结构(键是用户ID),需要先把它转换成数组才能进行统计,下面是两种实用的实现方案:

方案1:按投票类型分组统计

这个方案会输出每个投票类型的单独统计结果:

db.your_collection_name.aggregate([
  // 把votes对象转为数组,每个元素包含用户ID(k)和投票数据(v)
  {
    $project: {
      votesArray: { $objectToArray: "$votes" }
    }
  },
  // 展开数组,让每个投票成为独立文档
  {
    $unwind: "$votesArray"
  },
  // 按投票类型分组计数
  {
    $group: {
      _id: "$votesArray.v.vote",
      count: { $sum: 1 }
    }
  },
  // 重命名字段让结果更直观
  {
    $project: {
      vote_type: "$_id",
      total: "$count",
      _id: 0
    }
  }
])

执行后会得到类似这样的结果:

[
  { "vote_type": "up", "total": 1 },
  { "vote_type": "down", "total": 1 }
]

方案2:合并为单个文档展示总数

如果希望结果是一个包含所有投票类型总数的文档,可以用这个方案:

db.your_collection_name.aggregate([
  {
    $project: {
      votesArray: { $objectToArray: "$votes" }
    }
  },
  {
    $unwind: "$votesArray"
  },
  {
    $group: {
      _id: null,
      // 用条件累加统计up投票数
      up_total: { $sum: { $cond: [{ $eq: ["$votesArray.v.vote", "up"] }, 1, 0] } },
      // 用条件累加统计down投票数
      down_total: { $sum: { $cond: [{ $eq: ["$votesArray.v.vote", "down"] }, 1, 0] } }
    }
  },
  // 移除默认的_id字段
  {
    $project: {
      _id: 0
    }
  }
])

执行后结果示例:

{ "up_total": 1, "down_total": 1 }

关键步骤说明

  • $objectToArray:这是处理动态键的核心,它能把votes这种键值对对象转换成[{k: "用户ID", v: {vote: "up", ...}}]的数组结构,让我们能统一访问投票数据。
  • $unwind:将数组拆分成单个文档,确保每个投票都能被单独统计。
  • $group:根据需求选择分组方式,要么按投票类型分组计数,要么用$cond条件判断来累加不同类型的投票数。

内容的提问来源于stack exchange,提问作者Bastian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:10:09