mongodb汇总数据列与总计

时间:2020-05-21 00:55:31

标签: mongodb sum dataset aggregation-framework aggregate

使用以下汇总查询:

db.myColl.aggregate([
  {"$match":{ "State":"Iowa"}},
  {"$group":{ 
    "_id": "$County",
    "parks": {"$sum":"$ParkExp"}, 
    "roads": {"$sum": "$RoadExp"},
    "water": {"$sum": "$WaterExp"}
  }}
])

编辑:并给出一些示例数据,如下所示:

[
  {
    "State": "Iowa",
    "County": "Cass",
    "parks": 21,
    "roads": 22,
    "water": 11
  },
  {
    "State": "Iowa",
    "County": "Clay",
    "parks": 32,
    "roads": 32,
    "water": 33
  },
  {
    "State": "Iowa",
    "County": "Tama",
    "parks": 32,
    "roads": 38,
    "water": 19
  },
  {
    "State": "Texas",
    "County": "Cass",
    "parks": 18,
    "roads": 18,
    "water": 15
  },
  {
    "State": "Texas",
    "County": "Clay",
    "parks": 27,
    "roads": 26,
    "water": 14
  },
  {
    "State": "Iowa",
    "County": "Cass",
    "parks": 12,
    "roads": 32,
    "water": 29
  },
  {
    "State": "Iowa",
    "County": "Clay",
    "parks": 13,
    "roads": 21,
    "water": 11
  }
]

我能够返回一些有用的数据,如下所示:

{"_id":"Cass", "parks":33, "roads":54, "water":40}
{"_id":"Clay", "parks":45, "roads":53, "water":44}
{"_id":"Tama", "parks":32, "roads":38, "water":19}

但是我如何也可以在结果中添加总行呢?即

{"_id":"Totals", "parks":110, "roads":145, "water":103}

我可以轻松地遍历第一组结果,但是我宁愿尝试让Mongo完成所有工作。

TIA

1 个答案:

答案 0 :(得分:1)

您可以$group按常量值从所有文档中获取汇总,然后运行$concatArrays以获取包含4个文档的单个数组。之后,您可以运行$unwind$replaceRoot来获得与现在所获得的输出相同的输出,但是需要另外一份文档:

db.collection.aggregate([
{
    "$match": {
        "State": "Iowa"
    }
},
{
    "$group": {
        "_id": "$County",
        "parks": {
            "$sum": "$parks"
        },
        "roads": {
            "$sum": "$roads"
        },
        "water": {
            "$sum": "$water"
        }
    }
},
    {
        $group: {
            _id: "Total",
            parks: { $sum: "$parks" },
            roads: { $sum: "$roads" },
            water: { $sum: "$water" },
            entries: { $push: "$$ROOT" }
        }    
    },
    {
        $project: {
            all: {
                $concatArrays: [ "$entries", [ "$$ROOT" ] ]
            }
        }
    },
    {
        $project: {
            "all.entries": 0
        }
    },
    {
        $unwind: "$all"
    },
    {
        $replaceRoot: {
            newRoot: "$all"
        }
    }
])

Mongo Playground