【问题标题】:Mongodb Aggregation grouping with leave the fieldMongodb聚合分组与离开字段
【发布时间】:2014-03-05 09:17:16
【问题描述】:

应用聚合后

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
        }, 
    ...

如何修改请求以保留具有最小值score 的文档并获得保留字段id 的结果。例如,以这样的方式:

  {
            "_id" : ObjectId("50906d7fa3c412bb040eb579"),
            "score" : 14.8504576811645
   }

谢谢。

【问题讨论】:

  • 那么你想要的是每个学生得分最低的文件吗?还是只有一个得分最低的结果?
  • 是的,每个学生的最低分数,但是有一个字段“_id”。

标签: mongodb


【解决方案1】:

这是来自教育网站的家庭作业问题吗?我不记得了,但这是相当琐碎的。

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 
   }}
])

所有这一切都是在按student_id 分组时使用$first 获得第一个结果。首先就是这个意思,所以这仅在排序后才有用,并且与 $min 不同,后者会从分组结果中取最小值。

因此,如果您在其中取得了部分成绩,不仅可以保持第一个分数,而且还可以对 _id 值进行相同的操作。

额外的排序只是为了让结果不会让你失望,因为它们很可能以与student_id 相反的顺序出现。最后,只需少量使用$project 即可获得您想要的文档表单。

【讨论】:

  • 是的,你是对的,这是教育网站的问题。我成功地决定了,但使用了 Python 脚本。我想知道如何使用聚合来解决这个问题。感谢您的帮助和操作$first
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
相关资源
最近更新 更多