Используя Агрегационный конвейер , мы можем получить желаемый результат
В приведенном ниже запросе используются этапы конвейера $ project , $ unwind и операторы конвейера $ size и $ sum
db.collection_name.aggregate([
{ $project: {
"post_body": 1,
"author": 1,
"comments":1,
"comments_size":{$size: "$comments" }
}
},
{ $unwind: "$comments" },
{ $project: {
"post_body": 1,
"author": 1,
"comments":1,
"comments_size":1,
"replies_size" : {$size: "$comments.replies"}
}
},
{ $project: {
"_id":0,
"post_body": 1,
"author": 1,
"comments_count":{$sum:["$comments_size", "$replies_size"]}
}
}
])
Первая часть запроса агрегации использует $ project, и мы просто проецируем необходимые атрибуты на следующий этап, а также находим размер массива комментариев. Размер массива комментариев хранится во временном атрибуте comments_size
Во второй части используется $ unwind для разбиения вложенного массива в comments
и comments.replies
, массив comments
не разматывается и comments.replies
массив остается неизменным
Третья часть использует $ project для определения размера ответов и хранится во временном атрибуте replies_size
Четвертая и последняя часть снова использует $ project с $ сумма comments_size
и replies_size
для получения желаемого результата