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]}}},{$unwind:{path:"$failures",preserveNullAndEmptyArrays:true}},{$group:{_id:{id:"$id",level:"$failures.level"},count:{$sum:{$cond:[{$eq:[{$type:"$failures.level"},"missing"]},0,1]}},rules:{$first:"$rules"}}},{$group:{_id:"$_id.id",count:{$push:{$cond:[{$eq:[{$type:"$_id.level"},"missing"]},"$$REMOVE",{k:"$_id.level",v:"$count"}]}},rules:{$first:"$rules"}}},{$project:{"_id":0,"id":"$_id","count":{$arrayToObject:"$count"},"rules":1}},{$sort:{id:1}}])

Result