MongoDB 将总计添加到聚合管道中的 sortByCount()

标签 mongodb aggregation-framework

我已按国家/地区对所有用户进行分组,但我还希望有一行显示总计(在我们的用例中,用户被标记到单个国家/地区)。

数据模型/样本输入

该集合充满了代表国家/地区(name)的对象,每个对象都在 users 下的数组中包含一个用户对象列表。

{ _id: ObjectId("..."),
  name: 'SG',
  type: 'COUNTRY',
  increment: 200,
  users: 
   [ ObjectId("..."),
     ObjectId("..."),
     ...

查询

db.collection.aggregate([{$match:{type:"COUNTRY"}},{$unwind:"$users"},{$sortByCount:"$name"}])

当前结果

{ _id: 'SG', count: 76 } 
{ _id: 'IN', count: 6 }  
{ _id: 'US', count: 4 }  
{ _id: 'FR', count: 3 }  
{ _id: 'UK', count: 2 } 
{ _id: 'RU', count: 1 } 
{ _id: 'CO', count: 1 } 
{ _id: 'DK', count: 1 } 
{ _id: 'ID', count: 1 } 
{ _id: 'PH', count: 1 }

预期结果

{ _id: 'SG', count: 76 } 
{ _id: 'IN', count: 6 }  
{ _id: 'US', count: 4 }  
{ _id: 'FR', count: 3 }  
{ _id: 'UK', count: 2 } 
{ _id: 'RU', count: 1 } 
{ _id: 'CO', count: 1 } 
{ _id: 'DK', count: 1 } 
{ _id: 'ID', count: 1 } 
{ _id: 'PH', count: 1 }
{ _id: null, count: 96 } <<< TOTAL COUNT ADDED

有什么技巧可以在不诉诸复杂或肮脏技巧的情况下实现这一目标吗?

最佳答案

您还可以尝试使用 $facet 按国家/地区名称和总计数计算计数,然后将它们组合在一起。像这样的事情:

db.collection.aggregate([
  {
    $match: {
      type: "COUNTRY"
    }
  },
  {
    "$unwind": "$users"
  },
  {
    "$facet": {
      "groupCountByCountry": [
        {
          "$sortByCount": "$name"
        }
      ],
      "totalCount": [
        {
          "$group": {
            "_id": null,
            "count": {
              "$sum": 1
            }
          }
        }
      ]
    }
  },
  {
    "$project": {
      array: {
        "$concatArrays": [
          "$groupCountByCountry",
          "$totalCount"
        ]
      }
    }
  },
  {
    "$unwind": "$array"
  },
  {
    "$replaceRoot": {
      "newRoot": "$$ROOT.array"
    }
  }
])

这里是 Playground link .

关于MongoDB 将总计添加到聚合管道中的 sortByCount(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73689108/

相关文章:

c++ - 如何在 Visual Studio 中使用 mongodb-cxx-driver 设置项目

mongodb - 查找包含点的 Mongodb 地理空间圆

mongodb findOneAndUpdate 仅当满足特定条件时

MongoDB:如何在聚合上应用多个 $project

mongodb - 是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

javascript - 从 MongoDB 中的另一个集合中添加值

mongodb - Mongo 最大索引大小

mongodb - mongodb 查找中的条件 'from'

mongodb - 在 MongoDb 中,如何获取嵌入数组中出现的单个匹配元素的 max\min\avg\count ?

mongodb - MongoDB:对嵌入式文档使用“或”运算符对查询进行排序和限制