web-dev-qa-db-fra.com

Renvoyer un document qui a une valeur $ max dans un champ spécifique en utilisant mongodb

J'ai un fichier json qui contient des résultats de football. Je dois calculer quelle équipe a remporté le plus de matchs à l'extérieur et combien de victoires il y a eu.

Ma requête est la suivante:

db.football.aggregate(
{"$unwind": "$rounds"},
{"$unwind": "$rounds.matches"}, 

{"$project":
    {
        //"rounds.matches.team2.name":1,
        away_team: "$rounds.matches.team2.name",
        winner_away:
            { $cond: {if: {$gt:["$rounds.matches.score2","$rounds.matches.score1"] }, then:1,else :0} },
        _id:0   
    }
},
{"$group": {
    _id: {team_name:"$away_team"},
    total_wins: {$sum:"$winner_away"}
    }
}
)

et ce que je reçois est la suivante:

{ "_id" : { "team_name" : "Stoke City" }, "total_wins" : 6 }
{ "_id" : { "team_name" : "Newcastle United" }, "total_wins" : 2 }
{ "_id" : { "team_name" : "Chelsea" }, "total_wins" : 7 }
{ "_id" : { "team_name" : "Everton" }, "total_wins" : 5 }
{ "_id" : { "team_name" : "Bournemouth" }, "total_wins" : 6 }
{ "_id" : { "team_name" : "Manchester United" }, "total_wins" : 7 }
{ "_id" : { "team_name" : "Liverpool" }, "total_wins" : 8 }
{ "_id" : { "team_name" : "Manchester City" }, "total_wins" : 7 }
{ "_id" : { "team_name" : "Leicester City" }, "total_wins" : 11 }

Si j'ajoute cela pour obtenir uniquement l'équipe avec plus de victoires, le nom et le nombre de victoires

{"$group": {
        _id: "$team_name",
        max_wins: {$max: "$total_wins"}
        }
    }   

J'ai compris

{ "_id" : null, "max_wins" : 11 }

Quelqu'un peut-il aussi me dire comment obtenir le nom? Je peux le faire en utilisant sort, limit, mais cela ne fonctionnera pas si deux équipes ou plus ont un nombre de victoires égal.

3
Fierce82

ce que j'ai fait était le suivant: exporté vers une nouvelle collection temp puis, groupé par total_winds, trié par ID et pris les premiers éléments. Il renvoie non seulement le tout premier, mais tous ceux-ci étant égaux.

  db.temp.aggregate([
  {$group: {
      _id: "$total_wins",
      my_winner: {$Push: "$$ROOT"}
  }},
  {$sort:{_id:-1}},
  {$limit:1}  ]).pretty()
1
Fierce82

La deuxième étape de groupe $ n'obtient pas le nom de l'équipe car la précédente étape de groupe $ l'a mis en tant que sous-champ dans le champ _id. Vous pouvez modifier la deuxième phase de groupe $ pour obtenir le nom de l'équipe, comme ceci:

{"$group": {
    _id: {team_name:"$away_team"},
    total_wins: {$sum:"$winner_away"}
    }
}
,
{"$group": {
    _id: "$_id.team_name",
    max_wins: {$max: "$total_wins"}
    }
}

Cependant, cela ne résoudra pas le problème de trouver l'équipe s avec le plus de victoires, car cela vous donnera toujours la liste complète des équipes, chacune avec son nombre total de victoires.

0
Vince Bowdren