我试图找出总发生率及其占总发生率的百分比。
例如:
我们有一个用户表,其集合结构如下
user : [
{
email : A@abc.com,
eyeColor: blue,
},
{
email : B@abc.com,
eyeColor: brown,
},
{
email : C@abc.com,
eyeColor: blue,
},
{
email : D@abc.com,
eyeColor: red,
},
{
email : E@abc.com,
eyeColor: blue,
}
]现在,我可以使用聚合查询获得眼睛颜色的总出现次数。
db.users.aggregate([$group : [_id: “$eyeColor”,total : {$sum : 1}]
])我需要输出,如下所示
[{ "_id" : blue, "count" : 3 },{ "_id" : red, "count" : 1 },{ "_id" : brown, "count" : 1 }]现在,我想要得到的是,在上面的输出中,通过使用公式percentageOccupied,每个对象需要多一个字段,称为(occurrence / total_occurrence) * 100 (占总出现次数的多少%)。
例如,考虑到聚合输出,我们有3种蓝色,所以我需要如下所示
[{ "_id" : blue, "count" : 3, percentage: 60 },{ "_id" : red, "count" : 1, percentage: 20 },{ "_id" : brown, "count" : 1, percentage: 20 }, total : 5]发布于 2018-02-08 12:13:28
您需要使用$facet,使用facet可以在不同字段上对同一个文档执行多个操作
db.col.aggregate([
{ $facet : {
"total" : [{$count : "eyeColor"}],
"data" : [{$group : {_id : "$eyeColor", count : {$sum : 1}}}]
}},
{$unwind : "$data"},
{$addFields : {"data.percentage" : {$multiply : [{$divide : ["$data.count", {$arrayElemAt : ["$total.eyeColor", 0]}]}, 100]}}},
{$replaceRoot : {newRoot : "$data"}}
]).pretty()发布于 2018-02-08 14:03:31
您可以添加另一个$group阶段来计算计数和$addFields以输出百分比值。
db.users.aggregate([
{"$group":{"_id":null,"total":{"$sum":1},"eyeColor":{"$push":"$eyeColor"}}},
{"$unwind":"$eyeColor"},
{"$group":{"_id":"$eyeColor","total":{"$first":"$total"},"occurrence":{"$sum":1}}},
{"$project":{"percentage":{"$multiply":[{"$divide":["$occurrence","$total"]},100]}, "total":1}}
])https://stackoverflow.com/questions/48678579
复制相似问题