取mongoosejs中列的总和/平均值

时间:2012-10-18 06:35:00

标签: javascript node.js mongodb mongoose

我有一个带有字段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)

2 个答案:

答案 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()