如何解决mongodb-同一文档的两个依赖聚合
假设给出以下集合:
{"Year" : 2014,"State" : "AZ","Distributer" : "AAA","Revenu_category_A" : 300,"Revenu_category_B" : 42,"Revenu_category_C" : 75}
{"Year" : 2015,"Revenu_category_A" : 475,"Revenu_category_B" : 78,"Revenu_category_C" : 21}
{ "Year" : 2014,"State" : "NY","Revenu_category_A" : 74,"Revenu_category_B" : 44,"Revenu_category_C" : 13}
{"Year" : 2015,"Distributer" : "BBB","Revenu_category_A" : 234,"Revenu_category_B" : 41,"Revenu_category_C" : 433}
对于上述每个分销商,我想找到收入最少的类别,以及这些年来分销商从该类别中获得最多收益的州。
例如,参考上面的数据。如果我们看分销商AAA
并计算每个类别的总收入。结果如下:
category A
的总收入将为:849 category B
的总收入将是:164 category C
的总收入将为:109
根据该结果,category C
对分销商AAA
的总收入贡献最低(总收入109)。
然后,我们需要找到category C
为分销商AAA
带来最多收入的州。该州为AZ
,该州的总收入为96,而纽约州的总收入仅为13。
因此预期结果可以显示如下:
{"Distributer" : "AAA","Least_Revenue_category": "Revenu_category_A","State_with_most_revenue" : "AZ"}
{"Distributer" : "BBB"...}...
解决方法
要进行汇总,您将需要一种方法来识别哪些字段是收入类别。管线阶段可能是:
- 将收入类别字段收集到一组键值对
- 展开数组
- 按分发者,州和类别分组,并汇总每个类别的收入
- 按收入递减排序
- 按分销商和类别分组,存储第一条记录(按州分类),并汇总每个类别的收入
- 按收入升序排序
- 按分发者分组,为每个分发者捕获第一条记录。对于该分发服务器,这将是该类别中最小的类别,并且是该类别中的最高状态。
如果正则表达式匹配项可以识别这些字段,则可能类似于:
db.collection.aggregate([
{$addFields: {
fields: {
$filter: {
input: {$objectToArray: "$$ROOT"},cond: {
"$regexMatch": {
"input": "$$this.k","regex": "^Revenu"
}
}
}
}
}},{$unwind: "$fields"},{$group: {
_id: {
distributer: "$Distributer",state: "$State",category: "$fields.k"
},stateTotal: {$sum: "$fields.v"}
}},{$sort: {stateTotal: -1}},{$group: {
_id: {
distributer: "$_id.distributer",category: "$_id.category"
},most: {
$first: {
state: "$_id.state",stateTotal: "$stateTotal"
}
},catTotal: {$sum: "$stateTotal"}
}},{$sort: {catTotal: 1}},{$group: {
_id: "$_id.distributer","Least_Revenue_category": {$first: "$_id.category"},"State_with_most_revenue": {$first: "$most.state"}
}},{$project: {
_id: 0,Distributer: "$_id","Least_Revenue_category": 1,"State_with_most_revenue": 1
}}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。