我有一个带有字段student_id,Subject,Mark的MongoDB集合“Marks”。 我想要特定学生得分的平均值。 我的项目在NodeJs中,我使用MongooseJS进行对象建模。 如何使用MOngooseJS查询?
示例
Student_id Subject Mark
111 AAA 9
111 BBB 5
111 CCC 7
222 AAA 10
222 CCC 6
222 BBB 8
我希望学生得分的平均分数(id)111,即((9 + 5 + 7)/ 3)= 7)
答案 0 :(得分:12)
如果您使用的是MongoDB 2.2,则可以使用聚合框架:
var Mark = mongoose.model('mark', new Schema({
Student_id: Number,
Subject: String,
Mark: Number
}));
Mark.aggregate([
{ $group: {
_id: '$Student_id',
markAvg: { $avg: '$Mark'}
}}
], function (err, results) {
if (err) {
console.error(err);
} else {
console.log(results);
}
}
);
输出:
[ { _id: 222, markAvg: 8 }, { _id: 111, markAvg: 7 } ]
答案 1 :(得分:2)
这听起来像是MongoDB中Map / Reduce操作的海报子示例。
您要做的是首先运行一个地图步骤,您将发出属于学生ID 111的所有成绩。 然后运行reduce步骤,在其中平均这些步骤。
monogdb代码看起来应该类似于:
var map = function() {
emit(this.Student_id, this.Mark);
}
var reduce = function(key, values) {
var result = { studentid: key, mark_sum: 0, count: 0, avg_mark: 0 };
values.forEach(function(v) {
r.mark_sum += v;
r.count += 1;
});
return r;
}
var finalize = function(key, value) {
if (value.count > 0) {
value.avg_mark = value.mark_sum / value.count;
}
return value;
}
用Mongo语法执行mapReduce:
var command = db.runCommand( { mapreduce:"<your collection>",
map: map,
reduce: reduce,
query: { Student_id: 111 },
out: { reduce: "session_stat" },
finalize: finalize
});
map_reduce的结果写入session_stat
。在哪里可以查询。
要了解如何在Mongoose中使用MapReduce,请查看此问题:mongoose mapreduce()