如何获得学生成绩单的排名?

gre*_*ess 3 algorithm couchdb mapreduce ranking

我在CouchDB中的文档结构如下所示:

{
 "_id": "0a68cdbe4a7f3abf4046bc",
 "_rev": "1-1508",
 "score": {"math":90, "physics": 88, "chemistry": 60},
 "student_name": "Mike"
}
Run Code Online (Sandbox Code Playgroud)

我需要在前端显示以下统计信息以设置学生的个人资料:

  • 鉴于学生_id,我如何在每门课程中检索学生的等级;
  • 鉴于学生_id,我如何检索学生的总分(数学+物理+化学).

假设我只有2名学生,第二名学生的记录如下:

{
 "_id": "0a68cdbe2344a3abf4046bc",
 "_rev": "1-1608",
 "score": {"math":80, "physics": 98, "chemistry": 90},
 "student_name": "Jane"
}
Run Code Online (Sandbox Code Playgroud)

所以迈克的排名应该是:

math: 1
physics: 2
chemistry: 2
total: 2
Run Code Online (Sandbox Code Playgroud)

和Jane的排名应该是

math: 2
physics: 1
chemistry: 1
total: 1
Run Code Online (Sandbox Code Playgroud)

如果我没有明确说明问题,请告诉我.

我没有想出创建视图以获得排名的方法.我尝试过的:

  • 创建将分数映射到学生信息的视图.然后我可以查询分数范围,让学生得分在该范围内.

编辑:用户名查询和排名检索的功能不需要仅由视图实现.欢迎任何想法!

Edit2:课程数量为1K到3K.学生人数将在1M到2M之间.

sub*_*ing 6

我认为用一种观点做你想做的事是不可能的.会尝试这样的地图功能:

function(doc) {
  emit (["math", doc.score.math], doc.student_name);
  emit (["physics", doc.score.physics], doc.student_name);
  emit (["chemistry",doc.score.chemistry], doc.student_name);
  emit (["total",doc.score.math+doc.score.physics+doc.score.chemistry], doc.student_name);
}
Run Code Online (Sandbox Code Playgroud)

然后我会按顺序查询.这将返回按分数排序的值的学生列表.在那之后,我认为你必须以编程方式在软件中选择等级.

我认为reduce函数没有用,因为函数不会缩小结果集,也因为我无法想出一种方法来查询学生姓名并同时拥有整个学生列表.我认为列表没有用,因为我再也看不出如何让列表知道学生的名字,同时让结果中有整套学生.