db.grades.aggregate({'$group':{'_id':'$student_id', 'score':{'$gte':65}}}, {'$sort':{'score':1}}, {'$limit':1})
我无法理解为什么这不起作用。它应该“查找大于或等于65的所有考试成绩,并将这些成绩从最低到最高排序。”
它给出了错误:
错误:命令失败:{“ok”:0,“errmsg”:“未知组操作符'$ gte'”,“代码”:15952}:聚合失败
答案 0 :(得分:2)
您无法使用$gte
insde组。您可以在$match
阶段之前使用$group
agregation管道阶段,并在那里过滤$gte
。
无论如何,我认为您的查询不需要聚合;
这是否可以解决您的问题:
db.grades.find({'score':{'$gte':65}}).sort({'score':1}).limit(1)
答案 1 :(得分:2)
我认为db.grades.find,sort,limit非常简单。我喜欢。如果需要它使用聚合管道来做更高级的工作,那么只需将聚合视为一组步骤。它不像SQL(你把所有内容都塞进一个语句中)。
而是使用聚合管道在层中构建查询。通过一次添加一个元素执行以下,您就会明白我的意思。
null
$ match 得分> = 65.只使用该元素执行您的管道,您就会看到所有匹配的分数。
db.grades.aggregate(
{'$match':{'score':{'$gte':65}}},
{'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}},
{'$sort':{'scoreMax':-1}},
{'$limit':1}
)
$ group 获得每个student_id的最高分数(我认为,这是您的教授希望您合作的内容)
db.grades.aggregate(
{'$match':{'score':{'$gte':65}}}
)
$ sort 按顺序放置聚合的学生列表(最聪明的最傻瓜)
db.grades.aggregate(
{'$match':{'score':{'$gte':65}}},
{'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}}
)
$ limit 只吸引最优秀的学生和她的分数。
db.grades.aggregate(
{'$match':{'score':{'$gte':65}}},
{'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}},
{'$sort':{'scoreMax':-1}}
)