2

我有一个 MongoDB 集合“标记”,其中包含字段 student_id、主题、标记。我想要特定学生得分的平均值。我的项目在 NodeJs 中,我正在使用 MongooseJS 进行对象建模。如何使用 MMongooseJS 查询这个?

例子

     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)

4

2 回答 2

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 } ]
于 2012-10-18T12:51:50.130 回答
2

这听起来像是 MongoDB 中 Map/Reduce 操作的典型示例。

您要做的是首先运行一个 map 步骤,在其中发出属于学生 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()

于 2012-10-18T07:14:16.220 回答