Database

[{_id:"ObjectId('997v2ha1cv9b0036fa648zx3')",title:"Adidas Predator",size:"8",colors:[{hex:"005FFF",name:"Blue"},{hex:"FF003A",name:"Red"},{hex:"FFFE00",name:"Yellow"},{hex:"07FF00",name:"Green"},],extras:[{description:"laces",type:"exterior"},{description:"sole",type:"interior"},{description:"logo"},{description:"stud",type:"exterior"}],media:{images:[{url:"http://link.com",type:"exterior"},{url:"http://link3.com",type:"interior"},{url:"http://link2.com",type:"interior"},{url:"http://link4.com",type:"exterior"}]}}]

Query

db.collection.aggregate([{$project:{title:1,size:1,colors:"$colors.name",result:{$function:{body:"function(extras, images) {\n function groupBy(objectArray, k, v) {\n var results = [],\n res = objectArray.reduce((acc, obj) => {\n if (!acc[obj[k]]) acc[obj[k]] = [];\n acc[obj[k]].push(obj[v]);\n return acc;\n }, {});\n for (var o in res) {\n results.push({\n [k]: o === 'undefined' ? null : o,\n [v]: res[o]\n })\n }\n return results;\n }\n return {\n extras: groupBy(extras, 'type', 'description'),\n images: groupBy(images, 'type', 'url')\n }\n}",args:["$extras","$media.images"],lang:"js"}}}},{$project:{title:1,size:1,colors:1,extras:"$result.extras",images:"$result.images"}}])

Result