如何使用 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
获取每个 groupValue
的 nDoc
值
- 最后使用
$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
我想借助 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
获取每个groupValue
的nDoc
值 - 最后使用
$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