MongoDB聚合:如何计算嵌套数组中对象的years数组总长度?
MongoDB聚合计算球员职业生涯总年限
核心思路
根据你的文档结构,需要从teams数组中提取所有效力年份,通过两种常见逻辑计算职业生涯年限:
- 职业生涯跨度:从首次参赛年份到最后参赛年份的总时长(包含首尾年份)
- 实际效力年数:去掉重复年份后的实际参赛年份总数
方法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
相关产品推荐
相关产品推荐

