Database

[{"name":"Vikash","sub":"Physics","marks":10},{"name":"Vikash","sub":"Math","marks":20},{"name":"Raj","sub":"Physics","marks":5},{"name":"Raj","sub":"Math","marks":20},{"name":"Vikash","sub":"Physics","marks":20},{"name":"Vikash","sub":"Math","marks":30},{"name":"Raj","sub":"Physics","marks":40},{"name":"Raj","sub":"Math","marks":10}]

Query

db.collection.aggregate([{$group:{_id:{name:"$name",sub:"$sub"},avgMarks:{$avg:"$marks"}}},{$group:{_id:"$_id.name",sub:{$push:{sub:"$_id.sub",avgMarks:"$avgMarks"}}}},{$replaceRoot:{newRoot:{$arrayToObject:[[{k:"$_id",v:"$sub"}]]}}}])

Result