首页 > 解决方案 > $sum 聚合与不同的条件 MongoDb

问题描述

球员统计数据的收集

{ 
    "_id" : ObjectId("612d07a8a8a6a71ee90dadc3"), 
    "player" : ObjectId("612895db68507d470af61326"), 
    "team" : ObjectId("611cd49e9be5e530de899065"), 
    "role" : "IGL", 
    "steamid" : "STEAM_1:1:239330230", 
    "kills" : NumberInt(19), 
    "deaths" : NumberInt(17), 
    "assists" : NumberInt(3), 
    "match" : ObjectId("6128d5ffa2988ca4cb03a958"), 
    "game" : ObjectId("606701ed58d20c0e47d95fee"), 
    "league" : ObjectId("60f139faf2dfa914ad5682b6"), 
    "map" : "de_dust2", 
    "win" : 1.0
}

我想要基于不同比赛的团队每张地图的总胜利,只有 $sum 赢得一场独特的比赛。

询问

let teamWinsOnMap = await PlayerStats.aggregate()
        .group({ _id: {team: "$team", map: "$map"}, 
      match: { $addToSet: '$match' },
      team: { $first: '$team' },
      map: { $first: "$map" },
      win: { $sum: '$win' }
    })

结果

[
  {
    _id: { team: 611cd49e9be5e530de899065, map: 'de_inferno' },
    match: [ 612cc791b0c36af46dbd0c01, 612cc791b0c36af46dbd0c08 ],
    team: 611cd49e9be5e530de899065,
    map: 'de_inferno',
    win: 0
  },
  {
    _id: { team: 611cd49e9be5e530de899065, map: 'de_dust2' },
    match: [ 6128d5ffa2988ca4cb03a958 ],
    team: 611cd49e9be5e530de899065,
    map: 'de_dust2',
    win: 2
  }
]

问题 球队在只打一场比赛的情况下取得了 2 场胜利,因为我们有那场比赛的两名球员的统计数据

标签: mongodbmongoosemongodb-query

解决方案


问题是,当您从 addToSet 返回唯一匹配项时,您实际上并没有按它们进行分组,它只是计算该组阶段内所有文档的胜利。

如果您要执行两个单独的组,它应该可以工作。第一个将在特定地图上按团队获得所有独特的比赛,从该组中获取第一场胜利计数,因为它们应该都是相同的。然后再次分组并应用总和,它将返回正确的值。

Group
{
  _id: {
    match:"$match", team:"$team", map:"$map"
  },
  team:{$first:"$team"},
  map:{$first:"$map"},
  match:{$first:"$match"},
  win:{$first:"$win"}
}

然后通过

Group
{
  _id: {
    team:"$team", map:"$map"
  },
  team:{$first:"$team"},
  map:{$first:"$map"},
  matches:{$addToSet:"$match"},
  win:{$sum:"$win"}
}

推荐阅读