Как создать запрос MapReduce в MongoDb для расчета среднего балла за экзамен? - PullRequest
0 голосов
/ 04 декабря 2018

Я создаю базовый пример поиска в PHP с использованием MongoDB.Я очень новичок в MongoDb и PHP, а также.Ниже приведен пример документа коллекции students.

 { "_id" : 1, 
   "name" : "xyz", 
   "scores" : [ 
                { "score" : 60.06045071030959, "type" : "exam" }, 
                { "score" : 52.79790691903873, "type" : "quiz" }, 
                { "score" : 71.76133439165544, "type" : "homework" } 
              ] 
 }

. И я хочу создать функцию уменьшения карты, которая вычисляет средний балл по всем оценкам викторины.

Я начал сследующий код:

var mapFunction1 = function() {
                   emit(this._id, this.exam);
               };

var reduceFunction1 = function(keyId, examscore) {
                      return Array.sum(examscore);
                  };


db.students.mapReduce(
                 mapFunction1,
                 reduceFunction1,
                 { out: "map_reduce_example" }
               )

Но я не знаю, как получить доступ к score из type=quiz.

1 Ответ

0 голосов
/ 05 декабря 2018
    // construct map and reduce functions
$map = new MongoCode("function() {".
    "for (var idx = 0; idx < this.scores.length; idx++) {".
     "var key = this.scores[idx].type;".
     " var value = {".
     " count: 1,".
     " score: this.scores[idx].score ".
     "};".
     "emit(key, value);".
"}".
"};");
$reduce = new MongoCode("function(keyType, countObjVals) {".
    "reducedVal = { count: 0, score: 0 };".

   " for (var idx = 0; idx < countObjVals.length; idx++) {".
    "    reducedVal.count += countObjVals[idx].count;".
    "    reducedVal.score += countObjVals[idx].score;".
   " }".

   " return reducedVal;".
" };");
$finalizeFun = new MongoCode(
    "function (key, reducedVal) {".

      " reducedVal.avg = reducedVal.score/reducedVal.count;".

      " return reducedVal;".

    "};");
$students = $db->command(array(
    "mapreduce" => "students", 
    "map" => $map,`enter code here`
    "reduce" => $reduce,`enter code here`
    'finalize' => $finalizeFun,
    "out" => array("merge" => "eventCounts")
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...