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

MongoDB如何统计文档中score数组内所有对象的catches数组总长度

MongoDB统计score数组中catches总长度的实现方案

错误原因说明

你之前的写法无法得到正确结果的原因是:$score.catches 会返回由所有score子文档的catches数组组成的二维数组,直接用$size统计只会得到score数组的元素个数,而非所有catches数组的长度总和。

正确聚合实现

你可以通过$map遍历每个score元素,统计每个catches的长度后再用$sum求和,示例语句如下:

db.yourCollectionName.aggregate([
  {
    $project: {
      // 保留需要返回的原字段,比如球员名、赛事ID
      playerName: 1,
      tournamentId: 1,
      totalCatches: {
        $sum: {
          $map: {
            input: "$score",
            in: { $size: "$$this.catches" }
          }
        }
      }
    }
  }
])

如果你需要统计集合内所有文档的全局总接球数,可以额外增加$group阶段:

db.yourCollectionName.aggregate([
  {
    $project: {
      catchPerDoc: {
        $sum: {
          $map: {
            input: "$score",
            in: { $size: "$$this.catches" }
          }
        }
      }
    }
  },
  {
    $group: {
      _id: null,
      globalTotalCatches: { $sum: "$catchPerDoc" }
    }
  }
])

运算符说明

  • $map:遍历score数组的每一个元素,对每个元素执行in字段定义的逻辑
  • $$this:指向当前遍历到的score子元素
  • $size:统计每个子元素中catches数组的长度
  • $sum:将所有catches数组的长度累加得到最终总和

针对你给出的示例文档,执行上述单文档统计聚合后,得到的totalCatches结果为1,和实际数据情况一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:04