【问题标题】:Mongodb aggregate need help in one queryMongodb聚合在一个查询中需要帮助
【发布时间】:2018-07-18 14:46:01
【问题描述】:

我正在尝试查找总出现次数及其占总出现次数的百分比

例如:

我们有一个具有以下集合结构的用户表

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 }]

现在我想要得到的是,我需要使用公式(occurrence / total_occurrence) * 100 为上述输出中的每个对象添加一个名为 percentOccupied 的字段(总出现次数中有多少%的眼睛颜色)

例如考虑总产出 我们有 3 种蓝色,所以我需要像下面这样的东西

[{ "_id" : blue, "count" : 3, percentage: 60 },{ "_id" : red, "count" : 1, percentage: 20 },{ "_id" : brown, "count" : 1, percentage: 20 }, total : 5]

【问题讨论】:

    标签: mongodb mongoose aggregate


    【解决方案1】:

    你需要使用$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()
    

    【讨论】:

    • 获取无法识别的管道阶段名称错误:'$facet'
    • 好的,我使用的是 3.2 版本,此文件在 3.4 中
    【解决方案2】:

    您可以添加另一个$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}}
    ])
    

    【讨论】:

    • 获取无法识别的管道阶段名称错误:'$addFields'
    • 好的,我使用的是 3.2 版本,此文件在 3.4 中
    • $addFields 替换为$project。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2020-09-08
    相关资源
    最近更新 更多