我有一个复杂的群组查询。
数据如下:
汇总如下:
因此,执行后可以说结果是:
...
},
"_id" : {
"name" : "abc"
},
"amount" : 45.0,
"count" : 4.0,
"desc" : {
"value" : "Laptop", // based on highest sum amount in group:'abc' i.e. 25.0 for laptop
"count" : 5061.72, // (56*100)^2 + (44*100)^2
"percent" : 25.0*100/45.0 = 56.0
},
...
测试数据链接:MonogoDb Playground
已更新:2019年11月11日
添加了计算计数的示例
希望我很清楚。请帮助。
答案 0 :(得分:2)
不了解计算所需的计算量。但是,您可以根据需要使用以下查询:
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
]
}
}
}
])
技巧是将分组两次,并在其之间进行排序,以获得小计和第一个元素(每个名称的小计最大的元素)。 现在,您可以根据需要调整计数计算。