在多个文档的嵌套数组中聚合 MongoDB 查询

时间:2021-04-08 00:17:59

标签: mongodb

我正在为朋友的飞盘高尔夫成绩做一个小爱好项目。

我对 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 个不同的日子)。

enter image description here

代码:

aggregate(
        [
            {$unwind: "$results"},
            {$group: { 
                player: "$results.PlayerName",
                throws: "$results.Totalt"
            }},
            {$group: {
                _id: "$_id", 
                totalThrows: {$sum: "$results.Totalt"}
            }}
        ])

https://mongoplayground.net/p/aaKv3aaCeCi

1 个答案:

答案 0 :(得分:1)

您应该将 _id 字段(group by 表达式)传递到 $group 阶段并使用 $sumTotalt+/- 值求和。由于这些值是字符串,您应该在对它们求和之前使用 $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+/-",
    },
  },
])

MongoPlayground