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:{type:"terminal",name:"$terminal_type",key:"$terminal_type",amount:"$amount"}},cards:{$push:{type:"card",id:"$card.id",key:"$card.id",name:"$card.name",amount:"$amount"}}}},{$project:{amount:1,name:1,docs:{$concatArrays:["$cards","$terminals"]}}},{$unwind:"$docs"},{$group:{_id:{_id:"$_id",type:"$docs.type",key:"$docs.key"},amount:{$sum:"$docs.amount"},name:{$first:"$docs.name"},dataId:{$first:"$_id"},dataAmount:{$first:"$amount"},dataName:{$first:"$name"}}},{$group:{_id:"$_id._id",amount:{$first:"$dataAmount"},name:{$first:"$dataName"},terminals:{$push:{$cond:[{$and:[{$eq:["$_id.type","terminal"]},{$gt:["$name",null]}]},{amount:"$amount",name:"$name"},"$$REMOVE"]}},cards:{$push:{$cond:[{$and:[{$eq:["$_id.type","card"]},{$gt:["$name",null]}]},{amount:"$amount",name:"$name",id:"$_id.key"},"$$REMOVE"]}}}}])