Mongodb查询聚合和Groupby复杂过滤、求和、百分比查询
Posted
技术标签:
【中文标题】Mongodb查询聚合和Groupby复杂过滤、求和、百分比查询【英文标题】:Mongodb Query Aggregation and Groupby complex filter , sum , percent query 【发布时间】:2020-03-02 16:07:18 【问题描述】:我有一个复杂的组查询。
数据如下:
聚合如下:
-
按 doc_id 匹配
按名称分组
project: name, name_count, amount, desc as value: 由 desc 列表中金额的最大总和标识,count: (percent*100)^2 的总和,百分比:考虑该列表中金额的百分比
与 L1 和 L2 相同。但是 L1 L2 是从另一个集合中引用的字段 _id, name。所以,我需要同时投影 _id、name 和我在上面第 3 点所做的事情。
因此,执行后可以说结果是:
...
,
"_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 年 7 月 11 日
增加了计算计数的例子
希望我很清楚。请帮忙。
【问题讨论】:
你能提供两个集合的数据(作为json) 在问题中添加:mongoplayground.net/p/C9VREVlaaey 不需要数量(或数量已经处理好了) 这只是一个示例。否则不需要。另外,我更新了计数和百分比要求。请看那个 不懂计数。 (既不是结果也不是计算!) 【参考方案1】:不了解计数所需的计算。但是,您可以使用以下查询来满足您的需要:
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
]
])
提示是分组两次,并在两者之间进行排序,以获得小计和第一个元素(每个名称的小计最大的那个)。 现在您可以根据需要调整计数计算。
You can test it here.
【讨论】:
我在这里知道如何使用第二个小组赛阶段。 @matthPen:非常感谢。它适用于将 desc 添加到第一组。但是每个字段都需要类似的结果,即 L1 ,L2 ....以上是关于Mongodb查询聚合和Groupby复杂过滤、求和、百分比查询的主要内容,如果未能解决你的问题,请参考以下文章