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"}}}

])