将总计数添加到分组 + 汇总数据

qwe*_*rty 3 mongodb mongodb-query

我正在为 MongoDb 查询苦苦挣扎。

我有一个查询,可以对某些字段进行分组和计数,例如:

field_name | count
___________________
 
field1     | 10
field2     | 20
field3     | 30
Run Code Online (Sandbox Code Playgroud)

而且我想在最后添加总计数,使其看起来像这样:

field_name | count
___________________
 
field1     | 10
field2     | 20
field3     | 30
total      | 60
Run Code Online (Sandbox Code Playgroud)

我了解如何在 SQL(UNION 或 ROLLUP)中实现它,尽管我找不到在 Mongo 中实现它的方法。

这是我的查询,以防万一:

db.subscriptions.aggregate([
{$match: {isExpired: false}},
{$group: {_id: '$productId', count: {$sum: 1}}}
])
Run Code Online (Sandbox Code Playgroud)

var*_*man 5

您可以使用$facet实现此目的

$facet对传入的文档进行分类。我遵循的方法是,将所有文档放入一个数组(originalArr)中。您可以使用$exists:truefield_name 或 counts 或两者。这取决于你。获取另一个数组中的总计数 (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"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

工作Mongo 游乐场