使用以下汇总查询:
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
答案 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"
}
}
])