首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb聚合在一个查询中需要帮助

Mongodb聚合在一个查询中需要帮助
EN

Stack Overflow用户
提问于 2018-02-08 05:59:08
回答 2查看 284关注 0票数 2

我试图找出总发生率及其占总发生率的百分比。

例如:

我们有一个用户表,其集合结构如下

代码语言:javascript
复制
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, 
      }
]

现在,我可以使用聚合查询获得眼睛颜色的总出现次数。

代码语言:javascript
复制
db.users.aggregate([$group : [_id: “$eyeColor”,total : {$sum : 1}]  
])

我需要输出,如下所示

代码语言:javascript
复制
[{ "_id" : blue, "count" : 3 },{ "_id" : red, "count" : 1 },{ "_id" : brown, "count" : 1 }]

现在,我想要得到的是,在上面的输出中,通过使用公式percentageOccupied,每个对象需要多一个字段,称为(occurrence / total_occurrence) * 100 (占总出现次数的多少%)。

例如,考虑到聚合输出,我们有3种蓝色,所以我需要如下所示

代码语言:javascript
复制
[{ "_id" : blue, "count" : 3, percentage: 60 },{ "_id" : red, "count" : 1, percentage: 20 },{ "_id" : brown, "count" : 1, percentage: 20 }, total : 5]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-08 12:13:28

您需要使用$facet,使用facet可以在不同字段上对同一个文档执行多个操作

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2018-02-08 14:03:31

您可以添加另一个$group阶段来计算计数和$addFields以输出百分比值。

代码语言:javascript
复制
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}}
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48678579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档