Используйте MongoDB, чтобы узнать максимальные оценки на каждом экзамене - PullRequest
0 голосов
/ 16 июня 2020

У меня есть следующие json данные:

{ "_id" : { "Soid" : "50b59cd75bed76f46522c36a" }, "student_id" : 4, "class_id" : 5, "scores" : [ { "type" : "exam", "score" : 5.466727688497352 }, { "type" : "quiz", "score" : 48.70365097712529 }, { "type" : "homework", "score" : 84.00121183981668 }, { "type" : "homework", "score" : 67.53163246780703 }, { "type" : "homework", "score" : 66.19091789853015 } ] },
{ "_id" : { "Soid" : "50b59cd75bed76f46522c354" }, "student_id" : 0, "class_id" : 7, "scores" : [ { "type" : "exam", "score" : 18.20492211025179 }, { "type" : "quiz", "score" : 60.4769945611789 }, { "type" : "homework", "score" : 75.62999921143397 }, { "type" : "homework", "score" : 72.41228797373115 }, { "type" : "homework", "score" : 74.06744381708968 } ] },
{ "_id" : { "Soid" : "50b59cd75bed76f46522c358" }, "student_id" : 0, "class_id" : 10, "scores" : [ { "type" : "exam", "score" : 30.93065784731665 }, { "type" : "quiz", "score" : 55.98003281528393 }, { "type" : "homework", "score" : 55.6752702814148 }, { "type" : "homework", "score" : 63.15391302252755 } ] },


, и я хочу узнать максимальное количество баллов, полученных за каждый тип экзамена, например «экзамен», «викторина» и «домашнее задание».

Я знаю, что могу использовать mongos aggregate (), и я знаю, как получить максимум, например:

 db.grades.aggregate(
   [
     {
       $group:
         {
           _id: "Soid",
          {$scores: maxQuantity: { $max: "$score" }}
         }
     }
   ]
)

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

1 Ответ

0 голосов
/ 16 июня 2020

Вы можете сделать что-то вроде этого:

    db.grades.aggregate([
      {$unwind: "$scores" },
      {$group: { _id: "$scores.type", maxQuantity: { $max: "$scores.score" } }},
])

Сначала вы $unwind оценки, чтобы у вас была запись для каждого элемента массива в каждом документе. Затем вы можете сгруппировать его по типу. Таким образом, ответ будет таким:

/* 1 */
{
    "_id" : "homework",
    "maxQuantity" : 84.0012118398167
}

/* 2 */
{
    "_id" : "quiz",
    "maxQuantity" : 60.4769945611789
}

/* 3 */
{
    "_id" : "exam",
    "maxQuantity" : 30.9306578473166
}
...