我试图找出总发生率及其占总发生率的百分比
例如:
我们有一个具有以下集合结构的用户表
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]
答案 0 :(得分:2)
您需要使用$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()
答案 1 :(得分:2)
您可以添加另一个<PropertyRef Name="id" />
<PropertyRef Name="col1" />
<PropertyRef Name="col2" />
阶段来计算点数,并$group
来输出百分比值
$addFields