2

フィールドstudent_id、Subject、Markを持つMongoDBコレクション「Marks」があります。特定の学生が採点した点数の平均値が必要です。私のプロジェクトは NodeJs にあり、オブジェクト モデリングに MongooseJS を使用しています。MOngoseJSを使用してこれを照会する方法は?

     Student_id   Subject  Mark
     111          AAA      9
     111          BBB      5
     111          CCC      7
     222          AAA      10
     222          CCC      6
     222          BBB      8

Student(id) 111 ie((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 操作の代表的な例のように思えます。

やりたいことは、最初に、学生 ID 111 に属するすべての成績を出力する map ステップを実行することです。次に、これらを平均する 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 に答える