MongoDB - 计算嵌套数组的平均值

时间:2017-04-27 23:01:25

标签: arrays json mongodb

我是MongoDB的新手,我正在尝试创建一个计算学生平均分数的函数。

我创建了以下文档:

student = {
           "id": 123456,
           "name": "John",
           "surname": "Smith",
           "marks":
                  {
                   "a": [1,5,6,1],
                   "b": [1,1,2,4],
                   "c": [3,5]}

};

我知道如何为特定对象计算它 - 让我们说" a"但我不知道如何合并这3个对象以获得所有对象的平均值(10分) )。

以下是我的特定对象代码:

average = function (id,subj) 
     {
          result = [];

          student = db.students.findOne({ "id": 1234567});
          temp_array = student.marks[subj];
          var total = 0;

          for(var i = 0; i<temp_array.length; i++)
          {
                total += temp_array[i];
          }

          average = total / temp_array.length;
          result.push("The average is " + average);
          return result;
      };

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

$avg阶段使用$project的聚合。

这将为您提供每个数组abc的平均值:

db.students.aggregate([{
    $match: {
        "id": "1234567"
    }
}, {
    $project: {
        a: { $avg: "$marks.a" },
        b: { $avg: "$marks.b" },
        c: { $avg: "$marks.c" }
    }
}])

这将为您提供组合数组abc的平均值:

db.students.aggregate([{
    $match: {
        "id": "1234567"
    }
}, {
    $group: {
        _id: 1,
        all: {
            $push: {
                marks: ["$marks.a", "$marks.b", "$marks.c"]
            }
        }
    }
}, {
    $unwind: "$all"
}, {
    $unwind: "$all.marks"
}, {
    $unwind: "$all.marks"
}, {
    $group: {
        _id: 1,
        marks: { $avg: "$all.marks" }
    }
}])

第一个$group阶段用于将所有数组推送到另一个名为all的数组中。我们需要$unwind此数组和marks两次展开,以便在计算平均值的最后$group阶段之前为每个文档获取一个值