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

MongoDB聚合:如何计算嵌套数组中对象的years数组总长度?

MongoDB聚合计算球员职业生涯总年限

核心思路

根据你的文档结构,需要从teams数组中提取所有效力年份,通过两种常见逻辑计算职业生涯年限:

  1. 职业生涯跨度:从首次参赛年份到最后参赛年份的总时长(包含首尾年份)
  2. 实际效力年数:去掉重复年份后的实际参赛年份总数

方法1:计算职业生涯跨度(匹配你的期望输出)

通过$reduce合并所有年份数组,再取最大/最小值计算跨度:

db.players.aggregate([
  // 合并所有teams中的years数组为单一数组
  {
    $project: {
      name: 1,
      allYears: {
        $reduce: {
          input: "$teams",
          initialValue: [],
          in: { $concatArrays: ["$$value", "$$this.years"] }
        }
      }
    }
  },
  // 计算职业生涯跨度:max年份 - min年份 + 1
  {
    $project: {
      name: 1,
      careerLength: {
        $add: [
          { $subtract: [{ $max: "$allYears" }, { $min: "$allYears" }] },
          1
        ]
      }
    }
  }
])

针对你提供的Torii Hunter文档,该查询会返回careerLength: 19(2015-1997+1=19)。


方法2:计算实际效力年数(去重后的年份数量)

如果需要统计实际参赛的年份总数(排除重复记录),可以在合并数组后添加去重步骤:

db.players.aggregate([
  {
    $project: {
      name: 1,
      allYears: {
        $reduce: {
          input: "$teams",
          initialValue: [],
          in: { $concatArrays: ["$$value", "$$this.years"] }
        }
      }
    }
  },
  // 对年份数组去重
  {
    $project: {
      name: 1,
      uniqueYears: { $setUnion: ["$allYears", []] }
    }
  },
  // 计算去重后的年份数量
  {
    $project: {
      name: 1,
      careerLength: { $size: "$uniqueYears" }
    }
  }
])

你的示例文档中无重复年份,因此结果同样为careerLength: 19。若存在重复年份(如同一球员在同一队的同一年被重复记录),该方法会自动剔除重复值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:20:30