Database
[{"_id":ObjectId("5dbb1d0f9a17899b8ba690d6"),"array1":[{"type":"abc","action":"taken","points":10},{"type":"abc","action":"given","points":20},{"type":"xyz","action":"given","points":40},{"type":"xyz","action":"taken","points":30}]},{"_id":ObjectId("5dbb1d1b9a17899b8ba690d9"),"array1":[{"type":"xyz","action":"given","points":50},{"type":"xyz","action":"taken","points":40}]},{"_id":ObjectId("5dbb1d289a17899b8ba690e6"),"array1":[{"type":"abc","action":"taken","points":100},{"type":"abc","action":"given","points":200},{"type":"xyz","action":"given","points":500},{"type":"xyz","action":"taken","points":400}]}]
Query
db.collection.aggregate([{$match:{"array1.type":"abc"},},{$unwind:"$array1",},{$group:{_id:"$_id",totalAbc:{$sum:{$cond:{if:{$and:[{$eq:["$array1.action","given"]},{$eq:["$array1.type","abc"]}]},then:"$array1.points",else:{if:{$and:[{$eq:["$array1.action","taken"]},{$eq:["$array1.type","abc"]}]},then:{$multiply:["$array1.points",-1]},else:0}}}},totalXyz:{$sum:{$cond:{if:{$and:[{$eq:["$array1.action","given"]},{$eq:["$array1.type","xyz"]}]},then:"$array1.points",else:{if:{$and:[{$eq:["$array1.action","taken"]},{$eq:["$array1.type","xyz"]}]},then:{$multiply:["$array1.points",-1]},else:0}}}},}},{$match:{"totalAbc":{$gt:0}}},{$sort:{totalXyz:-1}},{$lookup:{from:"collection",localField:"_id",foreignField:"_id",as:"temp"}},{$project:{"_id":"$temp._id","array1":"$temp.array1"}}])