Получить значение идентификатора после агрегации конвейера

Рассмотрим следующие данные в коллекции с именем sample

{ "_id" : 1, "student_id" : 10, "type" : "homework", "score" : 63 },
{ "_id" : 3, "student_id" : 10, "type" : "homework", "score" : 14 },
{ "_id" : 2, "student_id" : 10, "type" : "quiz", "score" : 31 },
{ "_id" : 4, "student_id" : 10, "type" : "quiz", "score" : 54 },
{ "_id" : 5, "student_id" : 11, "type" : "homework", "score" : 33 },
{ "_id" : 7, "student_id" : 11, "type" : "homework", "score" : 74 },
{ "_id" : 6, "student_id" : 11, "type" : "quiz", "score" : 51 },
{ "_id" : 8, "student_id" : 11, "type" : "quiz", "score" : 24 }

Я хочу получить _id минимального балла, полученного каждым учеником в виде домашней работы.

У меня есть следующий запрос

db.sample.aggregate([
    {   $match: {   type: 'homework' }, },
    {
        $group: {
            _id: {
                student_id: '$student_id',
            },
            mark: {
                $min: '$score',
            }
        }
    }
])

который вычисляет минимальную оценку, но я хочу соответствующие _ids.

результат вышеупомянутого запроса

{ "_id" : { "student_id" : 11 }, "mark" : 33 }
{ "_id" : { "student_id" : 10 }, "mark" : 14 }

Это правильный подход, чтобы получить идентификаторы.

1 ответ

Решение

Использование $first с $sort по возрастанию вместо $min вытащить весь документ ($$ROOT) с наименьшей оценкой и картой обязательных полей.

db.col.aggregate([
  {"$match":{"type":"homework"}},
  {"$sort":{"score":1}},
  {"$group":{
    "_id":"$student_id",
    "doc":{"$first":{"score":"$$ROOT.score","_id":"$$ROOT._id"}}
  }}
])
Другие вопросы по тегам