MongoDB聚合查询获取指定玩家选择占比问题求助
解决指定玩家选择占比的MongoDB聚合查询方案
针对你的需求,以下是可直接复用的聚合查询方案,同时分析你返回结果为0的常见原因:
核心聚合查询(以查询玩家nicklas为例)
db.your_collection.aggregate([ // 1. 筛选目标玩家的所有记录 { $match: { playersName: "nicklas" } }, // 2. 按选择类型分组,统计每种选择的次数 { $group: { _id: "$playersChoice", count: { $sum: 1 } } }, // 3. 计算该玩家的总选择次数(全局窗口统计) { $setWindowFields: { partitionBy: null, output: { total_choices: { $sum: "$count" } } } }, // 4. 计算占比并格式化输出 { $project: { choice: "$_id", count: 1, total_choices: 1, percentage: { $round: [ { $multiply: [ { $divide: [ "$count", "$total_choices" ] }, 100 ] }, 2 ] }, _id: 0 } } ])
针对你的示例数据,执行后会返回:
{ "choice": "Scissor", "count": 1, "total_choices": 2, "percentage": 50 } { "choice": "Paper", "count": 1, "total_choices": 2, "percentage": 50 }
返回结果为0的常见原因
- 未正确筛选目标玩家:
$match阶段的playersName值拼写错误,或未添加该阶段导致统计了所有玩家的数据,目标玩家的选择占比被稀释为0。 - 分组逻辑错误:错误地按
playersName而非playersChoice分组,无法统计单玩家内的选择分布。 - 分母为0:
$match阶段未匹配到任何数据(比如玩家名不存在),此时total_choices为0,除法结果被处理为0。
扩展:一次性统计所有玩家的选择占比
如果需要同时获取所有玩家的选择分布,可调整为按玩家+选择分组:
db.your_collection.aggregate([ { $group: { _id: { name: "$playersName", choice: "$playersChoice" }, count: { $sum: 1 } } }, { $setWindowFields: { partitionBy: "$_id.name", output: { total_choices: { $sum: "$count" } } } }, { $project: { player: "$_id.name", choice: "$_id.choice", count: 1, total_choices: 1, percentage: { $round: [ { $multiply: [ { $divide: [ "$count", "$total_choices" ] }, 100 ] }, 2 ] }, _id: 0 } } ])
内容的提问来源于stack exchange,提问作者Rohman
相关产品推荐
相关产品推荐

