应用汇总后
db.grades.aggregate([
{$match: {'type': 'homework'}},
{$sort: {'student_id':1, 'score':1}}
])
得到了结果:
{
"result" : [
{
"_id" : ObjectId("50906d7fa3c412bb040eb579"),
"student_id" : 0,
"type" : "homework",
"score" : 14.8504576811645
},
{
"_id" : ObjectId("50906d7fa3c412bb040eb57a"),
"student_id" : 0,
"type" : "homework",
"score" : 63.98402553675503
},
...
如何修改请求以保留具有最小值得分的文档,并获得保持字段 id 的结果。例如,以这种方式:
{
"_id" : ObjectId("50906d7fa3c412bb040eb579"),
"score" : 14.8504576811645
}
感谢。
答案 0 :(得分:0)
这是教育网站的作业问题吗?我不记得了,但这是相当微不足道的。
db.grades.aggregate([
{ "$match": { type: 'homework' } },
{ "$sort": {student_id: 1, score: 1} },
{ "$group": {
"_id": "$student_id",
"doc": { "$first": "$_id"},
"score": { "$first": "$score"}
}},
{ "$sort: { "_id": 1 } },
{ "$project": {
"_id": "$doc",
"score": 1
}}
])
所有这一切都是使用$first来获取student_id
分组时的第一个结果。首先它恰恰意味着,所以这只有在排序后才有用,并且不同于$min,它将从分组结果中取最小值。
因此,如果你在那里有一部分,不仅保留了第一个分数,而且你也对_id
值进行相同的操作。
附加排序仅在那里,因此结果不会使您失望,因为它们可能以student_id
的相反顺序出现。最后,只需使用$project来获取您想要的文档格式。