Database

db={"users":[{"firstName":"David","lastName":"Mueller","messages":[{"text":"hello","type":"PERSONAL"},{"text":"test","type":"DIRECT"}]},{"firstName":"Mia","lastName":"Davidson","messages":[{"text":"hello world","type":"DIRECT"},{"text":":-)","type":"PERSONAL"},{"text":"hi there","type":"DIRECT"}]}]}

Query

db.users.aggregate([{$addFields:{messages:{$map:{input:{$setUnion:"$messages.type"},as:"type",in:{_id:"$$type",count:{$size:{$filter:{input:"$messages",as:"msg",cond:{$eq:["$$msg.type","$$type"]}}}}}}}}}])

Result