【问题标题】:Aggregate group multiple fields and calculate average mondodb聚合多个字段并计算平均mongodb
【发布时间】:2021-08-30 05:03:49
【问题描述】:

我有类似的示例数据

db.student.insert({"name":"Vikash", "sub":"Physics", "marks":10})
db.student.insert({"name":"Vikash", "sub":"Math", "marks":20})
db.student.insert({"name":"Raj", "sub":"Physics", "marks":5})
db.student.insert({"name":"Raj", "sub":"Math", "marks":20})
db.student.insert({"name":"Vikash", "sub":"Physics", "marks":20})
db.student.insert({"name":"Vikash", "sub":"Math", "marks":30})
db.student.insert({"name":"Raj", "sub":"Physics", "marks":40})
db.student.insert({"name":"Raj", "sub":"Math", "marks":10})

样本输出为:

    {
_id:"Vikash":[{
"sub":"Physics",
"avgMarks":15
},
{
"sub":"Math",
"avgMarks":25
}]
}

{
_id:"Raj":[{
"sub":"Physics",
"avgMarks":22.5
},
{
"sub":"Math",
"avgMarks":15
}]
}

【问题讨论】:

  • 您能否更正您的预期结果,它不是有效的 JSON 格式。
  • 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以阐明究竟需要解决哪些尚未解决的问题。

标签: mongodb aggregation-framework aggregate pipeline


【解决方案1】:
  • $group by namesub 并得到平均 marks by $avg
  • $group由唯一的name构造主题数组
  • $arrayToObject将对象的键值数组转换为对象
  • $replaceRoot 将上述对象替换为根
db.collection.aggregate([
  {
    $group: {
      _id: {
        name: "$name",
        sub: "$sub"
      },
      avgMarks: { $avg: "$marks" }
    }
  },
  {
    $group: {
      _id: "$_id.name",
      sub: {
        $push: {
          sub: "$_id.sub",
          avgMarks: "$avgMarks"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [
          [{ k: "$_id", v: "$sub" }]
        ]
      }
    }
  }
])

Playground

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 2012-10-11
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多