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

时间:2018-02-08 05:59:09

标签: mongodb mongoose aggregate

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

例如:

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

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]

2 个答案:

答案 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