如何使用 MongoDB 聚合计算百分比

How to calculate percentage using MongoDB aggregation

我想借助 mongoDB 聚合来计算百分比, 我的 collection 有以下数据。

subject_id gender other_data
1 Male XYZ
1 Male ABC
1 Male LMN
2 Female TBZ
3 Female NDA
4 Unknown UJY

我想要这样的输出:

[{
  gender: 'Male',
  total: 1,
  percentage: 25.0
},{
  gender: 'Female',
  total: 2,
  percentage: 50.0
},{
  gender: 'Unknown',
  total: 1,
  percentage: 25.0
}]

我尝试了各种方法,但none个方法都有效,主要是无法计算男、女、未知总和(计算百分比)。最棘手的部分是上面的例子中只有 4 个成员,但是他们的 subject_id 可能会根据 other_data

重复

提前致谢。

您可以使用此聚合查询:

  • 首先按 subject_id 分组以获得不同的值(不同的人)。
  • 然后用$facet创造“两条路”。一个使用 $count 并获取文档总数,另一个用于获取按性别分组的文档。
  • 然后使用所有期望值(按性别和文档总数分组)从 nDocs 获得结果的第一个元素进入 $facet 阶段。 $facet会生成一个数组,我们想要的值会在第一个位置。
  • 稍后使用 $unwind 获取每个 groupValuenDoc
  • 最后使用$project输出你想要的值。要获得百分比,您可以 $divide total/nDocs 和 $multiply 乘以 100。
db.collection.aggregate([
  {
    "$group": {
      "_id": "$subject_id",
      "gender": {
        "$first": "$gender"
      }
    }
  },
  {
    "$facet": {
      "nDocs": [
        {
          "$count": "nDocs"
        },
        
      ],
      "groupValues": [
        {
          "$group": {
            "_id": "$gender",
            "total": {
              "$sum": 1
            }
          }
        },
        
      ]
    }
  },
  {
    "$addFields": {
      "nDocs": {
        "$arrayElemAt": [
          "$nDocs",
          0
        ]
      }
    }
  },
  {
    "$unwind": "$groupValues"
  },
  {
    "$project": {
      "_id": 0,
      "gender": "$groupValues._id",
      "total": "$groupValues.total",
      "percentage": {
        "$multiply": [
          {
            "$divide": [
              "$groupValues.total",
              "$nDocs.nDocs"
            ]
          },
          100
        ]
      }
    }
  }
])

示例here