Не понимаю вычисления, необходимые для подсчета. Тем не менее, вот запрос, который вы можете использовать, чтобы удовлетворить ваши потребности:
db.collection.aggregate([
{
$match: {
"doc_id": 1
}
},
{
$group: {
_id: {
name: "$name",
desc: "$desc"
},
amount: {
$sum: "$amount"
},
count: {
$sum: 1
},
}
},
{
$sort: {
"_id.name": 1,
"amount": -1
}
},
{
$group: {
_id: "$_id.name",
amount: {
$sum: "$amount"
},
count: {
$sum: "$count"
},
desc: {
$first: {
value: "$_id.desc",
descAmount: "$amount"
}
}
},
},
{
$addFields: {
"desc.percent": {
$multiply: [
{
$divide: [
"$desc.descAmount",
"$amount"
]
},
100
]
}
}
}
])
Совет состоит в том, чтобы группировать дважды, с сортировкой между ними, чтобы получить промежуточный итог и первый элемент (тот, который имеет самый большой вложенный элемент). итого по каждому имени). Теперь вы можете адаптировать подсчет по своему усмотрению.
Вы можете проверить его здесь .