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

MongoDB多团队文档游戏字段总和计算的优化方案咨询

MongoDB计算团队游戏字段总和的最优实现方案

直接使用MongoDB的聚合框架在数据库层面完成计算是最优方案,无需将所有文档拉取到应用层再处理,能减少网络传输开销并利用数据库的查询优化能力,尤其适合后续数据量扩展的场景。

固定字段的直接聚合实现

针对你固定的game1到game7字段,使用$group阶段配合$sum操作符即可快速计算每个字段的总和:

db.teams.aggregate([
  {
    $group: {
      _id: null, // 按全局分组,不区分维度
      totalGame1: { $sum: "$game1" },
      totalGame2: { $sum: "$game2" },
      totalGame3: { $sum: "$game3" },
      totalGame4: { $sum: "$game4" },
      totalGame5: { $sum: "$game5" },
      totalGame6: { $sum: "$game6" },
      totalGame7: { $sum: "$game7" }
    }
  }
])

执行后会返回一个文档,包含每个game字段的全局总和,示例结果:

{
  "_id": null,
  "totalGame1": 8,
  "totalGame2": 16,
  "totalGame3": 24,
  "totalGame4": 32,
  "totalGame5": 40,
  "totalGame6": 48,
  "totalGame7": 16
}

若需计算所有game字段的总合

如果需要得到game1到game7的总和(而非单独每个字段的总和),可以在$group中嵌套$add操作:

db.teams.aggregate([
  {
    $group: {
      _id: null,
      totalAllGames: {
        $sum: {
          $add: ["$game1", "$game2", "$game3", "$game4", "$game5", "$game6", "$game7"]
        }
      }
    }
  }
])

动态字段的扩展方案(可选)

如果后续game字段数量可能变化(比如新增game8、game9),可以用$objectToArray将文档转为键值对数组,再通过$reduce过滤并累加game字段:

db.teams.aggregate([
  {
    $project: {
      games: {
        $filter: {
          input: { $objectToArray: "$$ROOT" },
          cond: { $regexMatch: { input: "$$this.k", regex: /^game\d+$/ } }
        }
      }
    }
  },
  {
    $group: {
      _id: null,
      totalAllGames: {
        $sum: { $sum: "$games.v" }
      },
      gameTotals: {
        $push: "$games"
      }
    }
  },
  {
    $project: {
      totalAllGames: 1,
      gameTotals: {
        $arrayToObject: {
          $map: {
            input: { $setUnion: [ "$gameTotals.k" ] },
            as: "key",
            in: {
              k: "$$key",
              v: {
                $sum: {
                  $map: {
                    input: "$gameTotals",
                    as: "item",
                    in: {
                      $cond: [ { $eq: [ "$$item.k", "$$key" ] }, "$$item.v", 0 ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

不过对于当前固定7个字段的场景,直接写死字段的聚合方案性能更高、代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:27