mongodb - $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 场胜利,因为我们有那场比赛的两名球员的统计数据
解决方案
问题是,当您从 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"}
}
推荐阅读
- spring - 春季集成:消息未从生产者端点传递到消费者端点
- android - UtteranceProgressListener 整体工作,但事件 onStart 和 onDone 不起作用
- c# - 状态机和网络套接字 - 如何处理竞争条件
- servicestack - 添加到 ExportTypes 时未在 DTO 上生成指定类型
- tensorflow - 在heroku上构建张量流时出错
- javascript - img src 返回未定义
- python - Gitlab-ci 不识别 python
- c# - 如何在 Windows 和 Linux 系统上使用 Avalonia 框架处理系统关闭事件?
- python - 使用 Python 类创建 Stripe 对象和处理错误的最佳方式
- python - 为什么我可以返回完整的查询结果,但不能返回指定的项目?