Database

[{name:"MAX",date:"2020-01-01",Math:98,Science:60,English:80},{name:"JANE",date:"2020-01-01",Math:80,Science:70,English:79},{name:"ALEX",date:"2020-01-01",Math:95,Science:68,English:70},{name:"JOHN",date:"2020-01-01",Math:95,Science:68,English:70},{name:"MAX",date:"2020-06-01",Math:97,Science:78,English:90},{name:"JANE",date:"2020-06-01",Math:78,Science:76,English:66},{name:"ALEX",date:"2020-06-01",Math:93,Science:75,English:82},{name:"JOHN",date:"2020-06-01",Math:92,Science:80,English:50}]

Query

db.collection.aggregate([{$group:{_id:"$name",Math:{$sum:"$Math"},Science:{$sum:"$Science"},English:{$sum:"$English"}}},{$project:{subjects:{$objectToArray:{Math:"$Math",Science:"$Science",English:"$English"}}}},{$unwind:"$subjects"},{$sort:{"subjects.v":-1}},{$group:{_id:"$subjects.k",students:{$push:{name:"$_id",score:"$subjects.v"}}}},{$project:{_id:0,subject:"$_id",students:{$slice:["$students",3]}}}])

Result