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
相关产品推荐
相关产品推荐

