Database
[{postId:"1",comment:{text_sentiment:"positive",topic:"A"}},/** DOC-1*/{postId:"2",comment:{text_sentiment:"negative",topic:"A"}},/** DOC-2*/{postId:"3",comment:{text_sentiment:"positive",topic:"B"}}]
Query
db.collection.aggregate([{$match:{/** surveyId: "e6d38e1ecd",*/"comment.topic":{$exists:1},}},{$group:{_id:{topic:"$comment.topic",text_sentiment:"$comment.text_sentiment"},total:{$sum:1},postIds:{$push:"$postId"}}},{$group:{_id:"$_id.topic",total:{$sum:"$total"},text_sentiments:{$push:{k:"$_id.text_sentiment",v:"$total"}},postIds:{"$push":"$postIds"}}},{$project:{topic:"$_id",topicOccurance:"$total",sentiment:{"$arrayToObject":"$text_sentiments"},postIds:{$reduce:{input:"$postIds",initialValue:[],in:{$concatArrays:["$$value","$$this"]}}}}},{$sort:{"topicOccurance":-1}}])