我想汇总以下示例数组的数据。
[
{
"_id": "5b7c0540342100091a375793",
"pages": [
{
"name": "ABCD",
"sections": [
{
"name": "sectionThird",
"id": 2,
"value": [
10,
50,
20
]
}
]
}
]
},
{
"_id": "5b3cd546342100514b4683a2",
"pages": [
{
"name": "ABCD",
"sections": [
{
"name": "sectionFourth",
"id": 2,
"value": [
19,
5,
8
]
},
{
"name": "sectionThird",
"id": 2,
"value": [
60
]
}
]
},
{
"name": "EFGH",
"sections": [
{
"name": "sectionFourth",
"id": 2,
"value": [
5
]
},
{
"name": "sectionThsads",
"id": 2,
"value": [
8
]
}
]
}
]
}
]
我想要以下输出:
[
{
"page": "ABCD",
"sections": [
{
"name": "sectionThird",
"totalValue": 140
},
{
"name": "sectionFourth",
"totalValue": 32
}
]
},
{
"page": "EFGH",
"sections": [
{
"name": "sectionFourth",
"totalValue": 5
},
{
"name": "sectionThsads",
"totalValue": 8
}
]
}
]
在上面的示例数组中,您可以看到有多个文档以“页面”作为键之一,它们也是对象的数组。每个页面对象都有一个键“名称”,它将对于“页面”数组中的每个对象都是唯一的。 “页面”对象具有“部分”键,并且它们中也具有“名称”键,这对于每个对象来说都是唯一的。
因此,将输出数组按page.name分组,然后按所有页面对象中的sections.name分组,并在具有相同部分名称的页面对象中将整个部分中的所有值数组总和。
答案 0 :(得分:1)
您可以使用以下汇总。
{$unwind
每个页面和每个部分,后跟$group
和$sum
,将每个部分的值求和,$push
将这些部分的值推回到页面数组中。
db.col.aggregate([
{"$unwind":"$pages"},
{"$unwind":"$pages.sections"},
{"$group":{
"_id":{"pagename":"$pages.name","sectionname":"$pages.sections.name"},
"totalTime":{"$sum":{"$sum":"$pages.sections.value"}}
}},
{"$group":{
"_id":"$_id.pagename",
"sections":{"$push":{"name":"$_id.sectionname","totalTime":"$totalTime"}}
}}])