MongoDB 聚合组,包含来自多个文档的数组对象值的总和,并按组计数
MongoDB Aggregation group with the sum of array object values from multiple document and count by group
我有一个 MongoDB 集合设置,它看起来像这样:
{
"_id": "1",
"TDL": {
"name": "TDL 05",
"TDLNumber": "031"
},
"POD": [{
"Volume": 35.40,
"VolUnit": "m3"
},
{
"Volume": 20.75,
"VolUnit": "m3"
},
{
"Volume": 15,
"VolUnit": "m3"
}
]
},
{
"_id": "2",
"TDL": {
"name": "Stock Watering",
"TDLNumber": "01"
},
"POD": [{
"Volume": 105,
"VolUnit": "m3"
},
{
"Volume": 70,
"VolUnit": "m3"
},
{
"Volume": 35,
"VolUnit": "m3"
}
]
},
{
"_id": "3",
"TDL": {
"name": "TDL 30 Stock Water",
"TDLNumber": "030"
},
"POD": [{
"Volume": 87,
"VolUnit": "m3"
}]
},
{
"_id": "4",
"TDL": {
"name": "TDL 30 Stock Water",
"TDLNumber": "030"
},
"POD": [{
"Volume": 25.12,
"VolUnit": "m3"
}]
},
{
"_id": "5",
"TDL": {
"name": "TDL 05",
"TDLNumber": "031"
},
"POD": [
{
"Volume": 21,
"VolUnit": "m3"
}
]
}
我想编写一个查询 (C# Driver 2.0) 给我一个结果,按 "TDL.TDLNumber" 和 "POD.Volume" 的总和分组。找到以下预期结果。
{
"TDLNumber":"031",
"GroupByDocCount": 2,
"CumulativeVol": 92.15
},
{
"TDLNumber":"030",
"GroupByDocCount": 2,
"CumulativeVol": 112.12
},
{
"TDLNumber":"01",
"GroupByDocCount": 1,
"CumulativeVol": 210
}
但是,我能够得到 "POD.Volume" 组的总和,但 "GroupByDocCount" 的计数不匹配。任何帮助将不胜感激!!
我也遇到了这样的问题,按照下面的方法希望你能得到预期的结果。
{
$group: {
_id: { activityName: '$activityName', groupName: '$item.groupName' },
item: {
$push: '$item'
}
}
},
{
$group: {
_id: "$_id.activityName",
group: {
$push: {
groupName: "$_id.groupName",
item: "$item",
}
}
}
},
请找到以下答案。这可能不是最佳的,但按预期工作
db.getCollection('test').aggregate([
{$group: {_id : "$TDL.TDLNumber", doc : {$push : "$POD"}}},
{$addFields: {"TDLNumber" : "$_id", "GroupByDocCount": {$size : "$doc"}, "Cumulative": {
$reduce: {
input: "$doc",
initialValue: [ ],
in: { $concatArrays: [ "$$value", "$$this" ] }
}
}}},
{$project:{"TDLNumber" : 1, "GroupByDocCount" : 1, "CumulativeVal" : {$sum : "$Cumulative.Volume"}}}
])
我有一个 MongoDB 集合设置,它看起来像这样:
{
"_id": "1",
"TDL": {
"name": "TDL 05",
"TDLNumber": "031"
},
"POD": [{
"Volume": 35.40,
"VolUnit": "m3"
},
{
"Volume": 20.75,
"VolUnit": "m3"
},
{
"Volume": 15,
"VolUnit": "m3"
}
]
},
{
"_id": "2",
"TDL": {
"name": "Stock Watering",
"TDLNumber": "01"
},
"POD": [{
"Volume": 105,
"VolUnit": "m3"
},
{
"Volume": 70,
"VolUnit": "m3"
},
{
"Volume": 35,
"VolUnit": "m3"
}
]
},
{
"_id": "3",
"TDL": {
"name": "TDL 30 Stock Water",
"TDLNumber": "030"
},
"POD": [{
"Volume": 87,
"VolUnit": "m3"
}]
},
{
"_id": "4",
"TDL": {
"name": "TDL 30 Stock Water",
"TDLNumber": "030"
},
"POD": [{
"Volume": 25.12,
"VolUnit": "m3"
}]
},
{
"_id": "5",
"TDL": {
"name": "TDL 05",
"TDLNumber": "031"
},
"POD": [
{
"Volume": 21,
"VolUnit": "m3"
}
]
}
我想编写一个查询 (C# Driver 2.0) 给我一个结果,按 "TDL.TDLNumber" 和 "POD.Volume" 的总和分组。找到以下预期结果。
{
"TDLNumber":"031",
"GroupByDocCount": 2,
"CumulativeVol": 92.15
},
{
"TDLNumber":"030",
"GroupByDocCount": 2,
"CumulativeVol": 112.12
},
{
"TDLNumber":"01",
"GroupByDocCount": 1,
"CumulativeVol": 210
}
但是,我能够得到 "POD.Volume" 组的总和,但 "GroupByDocCount" 的计数不匹配。任何帮助将不胜感激!!
我也遇到了这样的问题,按照下面的方法希望你能得到预期的结果。
{
$group: {
_id: { activityName: '$activityName', groupName: '$item.groupName' },
item: {
$push: '$item'
}
}
},
{
$group: {
_id: "$_id.activityName",
group: {
$push: {
groupName: "$_id.groupName",
item: "$item",
}
}
}
},
请找到以下答案。这可能不是最佳的,但按预期工作
db.getCollection('test').aggregate([
{$group: {_id : "$TDL.TDLNumber", doc : {$push : "$POD"}}},
{$addFields: {"TDLNumber" : "$_id", "GroupByDocCount": {$size : "$doc"}, "Cumulative": {
$reduce: {
input: "$doc",
initialValue: [ ],
in: { $concatArrays: [ "$$value", "$$this" ] }
}
}}},
{$project:{"TDLNumber" : 1, "GroupByDocCount" : 1, "CumulativeVal" : {$sum : "$Cumulative.Volume"}}}
])