首页 > 解决方案 > MongoDB .- 为数组的每个元素创建一个字段

问题描述

我收藏了一些英超联赛的这类比赛:

{"HomeTeam": "Chelsea", "HTScore": 2, "FTR": 'D', "AwayTeam": "Everton", "ATScore":2},
{"HomeTeam": "Chelsea", "HTScore": 3, "FTR": 'H', "AwayTeam": "Wolves", "ATScore":1},
{"HomeTeam": "Chelsea", "HTScore": 2, "FTR": 'D', "AwayTeam": "Everton", "ATScore":2},
.....
{"HomeTeam": "Liverpool", "HTScore": 1, "FTR": 'A', "AwayTeam": "Aston Villa", "ATScore":3}
{"HomeTeam": "Liverpool", "HTScore": 6, "FTR": 'H', "AwayTeam": "Chelsea", "ATScore":3}
etc.

其中HomeTeamAwayTeam代表比赛的两支球队,HTScore代表主队得分,ATScore代表客队得分并FTR代表全场结果('A':客队获胜,'D':平局,'H':主队获胜)

我想创建一个这种类型的表,在上面的示例中是这样的

HomeTeam  | Number of Victories | Number of Draws | Number of Defeats | Max Goals scored in a Match
---------------------------------------------------------------------------------------
Chelsea   |         1           |        2        |         0         |          3
---------------------------------------------------------------------------------------
Liverpool |         1           |        0        |         1         |          6

有没有办法通过迭代 FTR 的值来自动创建这些字段?非常感谢您提前

标签: mongodb

解决方案


您可以使用聚合管道,并$group以这种方式:

  • $group获取主队的数据。在这里,为每个字段添加一个新字段,称为result存储最终结果的位置,另一个称为goals进球数。
  • 然后使用 设置结果中有多少“D”、“H”或“A”,即有多少胜、负或平$filter
  • 并且至少用于$project获取您想要的值。在这种情况下size,数组的和max得分的值。
db.collection.aggregate([
  {
    "$group": {
      "_id": "$HomeTeam",
      "result": {
        "$push": "$FTR"
      },
      "goals": {
        "$push": "$HTScore"
      }
    }
  },
  {
    "$set": {
      "draws": {
        "$filter": {
          "input": "$result",
          "as": "d",
          "cond": {"$eq": ["$$d","D"]}
        }
      },
      "wins": {
        "$filter": {
          "input": "$result",
          "as": "w",
          "cond": {"$eq": ["$$w","H"]}
        }
      },
      "defeat": {
        "$filter": {
          "input": "$result",
          "as": "a",
          "cond": {"$eq": ["$$a","A"]}
        }
      }
    }
  },
  {
    "$project": {
      "HomeTeam": "$_id",
      "Number_of_victories": {"$size": "$wins"},
      "Number_of_draws": {"$size": "$draws"},
      "Number_of_defeats": {"$size": "$defeat"},
      "Max_goals": {"$max": "$goals"}
    }
  }
])

这里的例子


推荐阅读