Mongodb Aggregation分组离开现场

时间:2014-03-04 09:55:46

标签: mongodb

应用汇总后

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
   }

感谢。

1 个答案:

答案 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来获取您想要的文档格式。