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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:33:28