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([{$unwind:"$messages"},{$group:{_id:{_id:"$_id",type:"$messages.type"},countType:{$count:{}},doc:{$first:"$$ROOT"}}},{$group:{_id:"$_id._id",doc:{$first:"$doc"},messages:{$push:{_id:"$_id.type",count:"$countType"}}}},{$set:{"doc.messages":"$messages"}},{$replaceWith:"$doc"}])

Result