我是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;
};
非常感谢任何帮助!
答案 0 :(得分:0)
这将为您提供每个数组a
,b
和c
的平均值:
db.students.aggregate([{
$match: {
"id": "1234567"
}
}, {
$project: {
a: { $avg: "$marks.a" },
b: { $avg: "$marks.b" },
c: { $avg: "$marks.c" }
}
}])
这将为您提供组合数组a
,b
和c
的平均值:
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
阶段之前为每个文档获取一个值