Database
[{key:1,channels:[{"id":1,"name":"XXX","folder":"C"},{"id":2,"name":"XXX","folder":"A"},{"id":3,"name":"XXX","folder":"B"},{"id":4,"name":"XXX","folder":"A"},{"id":5,"name":"XXX","folder":"B"},{"id":6,"name":"XXX","folder":"C"}]},{key:2,channels:[{"id":1,"name":"XXX","folder":"D"},{"id":2,"name":"XXX","folder":"B"},{"id":3,"name":"XXX","folder":"A"},{"id":4,"name":"XXX","folder":"C"},{"id":5,"name":"XXX","folder":"A"},{"id":6,"name":"XXX","folder":"D"}]}]
Query
db.collection.aggregate([{$match:{key:{$in:[1,2]}}},{$unwind:"$channels"},{$group:{_id:{key:"$key",folder:"$channels.folder"},value:{$push:"$channels",},"foldersRef":{$push:"$channels.folder"},}},{$group:{_id:"$_id.key","channels":{"$push":"$value"},},},{"$project":{"channels":{"$map":{"input":"$channels","as":"channel","in":{"$arrayToObject":[[{"v":{"$map":{"input":"$$channel","as":"subChannel","in":{"id":"$$subChannel.id","name":"$$subChannel.name",}}},"k":{"$arrayElemAt":["$$channel.folder",0]},}]],},}},},},])