Database

[{"id":1,"failures":[{"level":"BASIC","message":"failure"},{"level":"BASIC","message":"failure"},{"level":"WARNING","message":"failure"}],"rules":["X","Y"]},{"id":2,"failures":[{"level":"BASIC","message":"failure"},{"level":"WARNING","message":"failure"}],"rules":["X"]},{"id":3,"failures":[],"rules":["X","Y"]}]

Query

db.collection.aggregate([{$match:{"id":{$in:[1,2,3]}}},{$facet:{emptyFailures:[{$match:{$expr:{$eq:[{$ifNull:["$failures",[]]},[]]}}},{$set:{counts:{$literal:{}}}},{$project:{"_id":0,"id":1,"counts":1,"rules":1}}],withFailures:[{$match:{failures:{$ne:[]}}},{$unwind:{path:"$failures"}},{$group:{_id:{id:"$id",level:"$failures.level"},count:{$sum:1},rules:{$first:"$rules"}}},{$group:{_id:"$_id.id",count:{$push:{k:"$_id.level",v:"$count"}},rules:{$first:"$rules"}}},{$project:{"_id":0,"id":"$_id","count":{$arrayToObject:"$count"},"rules":1}}]}},{$set:{failures:{$concatArrays:["$withFailures","$emptyFailures"]}}},{$unwind:"$failures"},{$replaceWith:"$failures"},{$sort:{id:1}}])

Result