我正在努力处理MongoDb查询。
我有一个查询,可以对一些字段进行分组和计数,例如:
field_name | count
___________________
field1 | 10
field2 | 20
field3 | 30
我也想在末尾添加总数,使其看起来像这样:
field_name | count
___________________
field1 | 10
field2 | 20
field3 | 30
total | 60
尽管我找不到在Mongo中实现SQL的方法,但我知道如何在SQL中实现它(UNION或ROLLUP)。
这是我的查询,以防万一:
db.subscriptions.aggregate([
{$match: {isExpired: false}},
{$group: {_id: '$productId', count: {$sum: 1}}}
])
答案 0 :(得分:5)
您可以使用$facet
$facet
对收到的文档进行分类。我遵循的方法是,将所有文档放入一个数组(originalArr)。您可以将$exists:true
用于field_name或计数或将两者都使用。这取决于你。获取另一个数组中的总数(totalArr)。然后$concat
将两个数组合并为一个。
[
{
"$facet": {
"originalArr": [
{
$match: {
count: {
"$exists": true
}
}
},
{
"$project": {
_id: 0
}
}
],
"totalArr": [
{
"$group": {
"_id": null,
"field_name": {
"$first": "total"
},
"count": {
$sum: "$count"
}
}
},
{
"$project": {
_id: 0
}
}
]
}
},
{
$project: {
combined: {
"$concatArrays": [
"$originalArr",
"$totalArr"
]
}
}
},
{
"$unwind": "$combined"
},
{
"$replaceRoot": {
"newRoot": "$combined"
}
}
]