Database
[{id:1,name:"cash",amount:10},{id:2,name:"IPT",amount:10,terminal_type:"inside",card:{id:1,name:"visa"}},{id:2,name:"IPT",amount:10,terminal_type:"outside",card:{id:1,name:"visa"}},{id:2,name:"IPT",amount:10,terminal_type:"outside",card:{id:7,name:"visa"}}]
Query
db.collection.aggregate([{$group:{_id:"$id",name:{$first:"$name"},amount:{$sum:"$amount"},terminals:{$push:{name:"$terminal_type",amount:"$amount"}},cards:{$push:{id:"$card.id",name:"$card.name",amount:"$amount"}},cardIds:{$addToSet:"$card.id"},terminalNames:{$addToSet:"$terminal_type"}}},{$project:{_id:0,id:"$_id",name:1,amount:1,cards:{$map:{input:"$cardIds",as:"card",in:{id:"$$card",amount:{$reduce:{input:"$cards",initialValue:0,in:{$add:["$$value",{$cond:[{$eq:["$$card","$$this.id"]},"$$this.amount",0]}]}}},name:{$reduce:{input:"$cards",initialValue:"",in:{$cond:[{$eq:["$$this.id","$$card"]},"$$this.name","$$value"]}}}}}},terminals:{$map:{input:"$terminalNames",as:"terminal",in:{name:"$$terminal",amount:{$reduce:{input:"$terminals",initialValue:0,in:{$add:["$$value",{$cond:[{$eq:["$$terminal","$$this.name"]},"$$this.amount",0]}]}}},}}}}}])