我需要将mongoDb中聚合的结果与不同列的平均值和总和相加

时间:2019-05-20 06:55:22

标签: mongodb mongodb-query aggregation-framework

我对mongo Query进行了整合,这给了我这样的结果

[
{
    tokens : 129,
    avgwaitingTime : 5,
    service: 'xx'
},
{
    tokens : 9,
    avgwaitingTime : 1,
    service: "yy"
}
]

我需要做的是通过添加一行包含令牌总数的行来追加结果,像这样使用聚合来计算所有avgwaitingTime的平均值。

[
    {
        tokens : 129,
        avgwaitingTime : 5,
        service: 'xx'
    },
    {
        tokens : 9,
        avgwaitingTime : 1,
        service: "yy"
    },
    {
        tokens : 138, // sum of all tokens
        avgwaitingTime : 3 // avg of avgwaitingTime (6+1)/2
        service : ''
    }
]

我汇总的最后一部分是$ project

[
   ..//////
   ..//////
   $project:{
      tokens: '$tokens',
      service: '$service',
      avgwaitingTime: '$avgwaitingTime'
   }
]

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

基本上,您希望两个($project + $group)的结果在此处具有相同的pipline。因此,您需要将pipeline进一步分为两部分,这就是$facet所提供的。

db.collection.aggregate([
  { "$facet": {
    "lastPart": [
      { "$project": {
        "tokens": "$tokens",
        "service": "$service",
        "avgwaitingTime": "$avgwaitingTime"
      }}
    ],
    "total": [
      { "$group": {
        "_id": null,
        "tokens": { "$sum": "$tokens" },
        "avgwaitingTime": { "$sum": "$avgwaitingTime" }
      }}
    ]
  }},
  { "$project": {
    "data": {
      "$concatArrays": ["$total", "$lastPart"]
    }
  }},
  { "$unwind": "$data" },
  { "$replaceRoot": { "newRoot": "$data" }}
])

MongoPlayground