Вставьте два элемента в $ push с помощью $ cond в Mongodb - PullRequest
1 голос
/ 09 октября 2019

У меня есть этот запрос в mongodb, который означает, что выигранная команда получит 3 очка, а команды по жеребьевке - по 1.


db.football.aggregate([ 
  { "$match": {
      "$and": [
        { "Div": "SP1" }
      ]
    }
  },
  { "$group": { 
      "_id": {
        "div": "$Div"
      },
      "teams": { 
        "$push": {
          "$cond": {
            "if": { "$eq": [ "$FTR", "H" ] }, 
            "then": { "T": "$HomeTeam", "P": 3 },
            "else": {
              "$cond": {
                "if": { "$eq": [ "$FTR", "A" ] }, 
                "then": { "T": "$AwayTeam", "P": 3 },
                "else": {
                  "$cond": {
                    "if": { "$eq": [ "$FTR", "D" ] }, 
                    "then": { "draws": [{ "T": "$HomeTeam", "P": 1}, { "T": "$AwayTeam", "P": 1 }] },
                    "else": "Error" 
                  }
                }
              }
            }
          }
        }
      }
    }
  }
])

Что приводит к:

{ "_id" : { "div" : "SP1" }, 
          "teams" : [ 
                      { "T" : "La Coruna", "P" : 3 },
                      { "T" : "Malaga", "P" : 3 },
                      { "draws": [
                                   { "T" : "Barcelona", "P" : 1 },
                                   { "T" : "Villarreal", "P" : 1 }
                                 ]
                      },
                     ...
                    ]
}

Убедитесь, что у меня есть массив для команд ничьих, но я просто хочу большой массив в командах, как показано ниже:

{ "_id" : { "div" : "SP1" }, 
          "teams" : [ 
                      { "T" : "La Coruna", "P" : 3 },
                      { "T" : "Malaga", "P" : 3 },
                      { "T" : "Barcelona", "P" : 1 },
                      { "T" : "Villarreal", "P" : 1 },
                     ...
                    ]
}

Я пытался выставить unwind команд, но безрезультатно.

Набор данных можно скачать здесь: https://www.football -data.co.uk / mmz4281 / 1617 / SP1.csv Информация о наборе данных: https://www.football -данные.co.uk / notes.txt

Чтобы импортировать CSV:

mongoimport -d dataset -c football --type csv --file path_to_file_SP1.csv --headerline --drop --stopOnError

1 Ответ

2 голосов
/ 09 октября 2019

Вы можете использовать $ reduce , чтобы сгладить массив. Поскольку у вас есть два разных типа элементов, вы можете использовать $ cond с $ type , чтобы определить, следует ли объединять отдельный элемент или поле draws.

db.collection.aggregate([
    {
        $addFields: {
            teams: {
                $reduce: {
                    input: "$teams",
                    initialValue: [],
                    in: {
                        $cond: [
                            { $eq: [ { $type: "$$this.draws" }, "array" ] },
                            { $concatArrays: [ "$$value", "$$this.draws" ] },
                            { $concatArrays: [ "$$value", ["$$this"] ] }
                        ]
                    }
                }
            }
        }
    }
])

Детская площадка Монго

...