Você pode usar a agregação abaixo.
Agrupe por pergunta e resposta para obter a contagem para combinação, seguido de grupo por pergunta para obter a resposta e sua contagem.
db.getCollection('testAggregate').aggregate([
{"$group":{
"_id":{"question":"$question","answer":"$answer"},
"count":{"$sum":1}
}},
{"$group":{
"_id":"$_id.question",
"answers":{"$push":{"answer":"$_id.answer","count":"$count"}}
}}
]);
Você pode usar o código abaixo para obter o formato desejado em 3.4.
Alterar
$group
chaves em k e v seguido por $addFields
com $arrayToObject
para transformar a matriz em pares de valores-chave nomeados. db.getCollection('testAggregate').aggregate([
{"$group":{
"_id":{"question":"$question","answer":"$answer"},
"count":{"$sum":1}
}},
{"$group":{
"_id":"$_id.question",
"answers":{"$push":{"k":"$_id.answer","v":"$count"}}
}},
{"$addFields":{"answers":{"$arrayToObject":"$answers"}}}
]);