Получить значение идентификатора после агрегации конвейера
Рассмотрим следующие данные в коллекции с именем 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"}}
}}
])