我正在为朋友的飞盘高尔夫成绩做一个小爱好项目。
我对 MongoDB 还是很陌生,我一直在查询。我想要做的是在表单 [{player: "Name", totalThrows: (sum of Totalt field), total+/-: (sum of +/- field)}]
上返回一个 JSON 对象。
简而言之:我想在我的数据库中超过 3 个不同的文档中汇总每个球员的总投球数(总场数)和总投球数。
最终的 JSON 如下所示:[{player: "Tormod", totalThrows: 148, total+/-: 24}, {player: "Martin", totalThrows: 149, total+/-: 25}, {player: "Andreas", totalThrows: 158, total+/-: 34}]
下图显示了我保存在 MongoDB 中的文档。结果数组由特定玩家圆盘高尔夫的结果组成。在不同文档的结果数组中,哪个玩家排在第一位也没有固定的顺序。每个文档代表一个新的回合(想想玩 3 个不同的日子)。
代码:
aggregate(
[
{$unwind: "$results"},
{$group: {
player: "$results.PlayerName",
throws: "$results.Totalt"
}},
{$group: {
_id: "$_id",
totalThrows: {$sum: "$results.Totalt"}
}}
])
答案 0 :(得分:1)
您应该将 _id
字段(group by 表达式)传递到 $group
阶段并使用 $sum
对 Totalt
和 +/-
值求和。由于这些值是字符串,您应该在对它们求和之前使用 $toInt
将它们转换为整数。最后,您可以根据所需的结构对值进行投影。
顺便说一句,看起来大多数数字字段都以字符串形式存储在文档中。我建议您更新文档,将它们全部转换为数字,并确保只将数字添加到新文档的数字字段中。
db.collection.aggregate([
{
$unwind: "$results",
},
{
$group: {
_id: "$results.PlayerName",
totalThrows: {
$sum: {
$toInt: "$results.Totalt",
},
},
"total+/-": {
$sum: {
$toInt: "$results.+/-",
},
},
},
},
{
$project: {
_id: 0,
player: "$_id",
totalThrows: "$totalThrows",
"total+/-": "$total+/-",
},
},
])