MongoDb查询聚合

时间:2016-10-23 15:50:27

标签: mongodb aggregation-framework database

db.grades.aggregate({'$group':{'_id':'$student_id', 'score':{'$gte':65}}}, {'$sort':{'score':1}}, {'$limit':1})

我无法理解为什么这不起作用。它应该“查找大于或等于65的所有考试成绩,并将这些成绩从最低到最高排序。”

它给出了错误:

  

错误:命令失败:{“ok”:0,“errmsg”:“未知组操作符'$ gte'”,“代码”:15952}:聚合失败

2 个答案:

答案 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}}
)