MongoDB 如何对数组计算后获取最大值记录

集合数据为嵌套列表结构,对嵌套列表中的值计算后取最大值的记录。如有集合 scores 记录学生的各科成绩,查询平均成绩最好的学生,其数据如下:

{
       "StudentID":"S0001",
       "Scores":[{"Course":"Chinese","Score":75},{"Course":"Maths","Score":81},
        {"Course":"English","Score":78}]

  }
  {
       "StudentID":"S0002",
       "Scores":[{"Course":"Chinese","Score":80},{"Course":"Maths","Score":78},
        {"Course":"English","Score":76}]

  }
  {
       "StudentID":"S0001",
       "Scores":[{"Course":"Chinese","Score":78},{"Course":"Maths","Score":75},
        {"Course":"English","Score":72}]

  }

MongoDB 实现思路是: aggregate 下用 $unwind 对 Scores 展开成行,按 StudentID 分组求平均成绩 avg_score ,再按 avg_score 分组 统计 学生,根据 avg_score 排序取最好成绩的学生 记录,再用 $unwind 对 学生号展开,最后显示记录。

 使用集算器, 根据最好的平均成绩返回记录,实现比较容易
1、编写脚本 scores.dfx


A B
1 =mongo_open("mongodb://localhost:27017/raqdb") / 连接 MongoDB 数据库
2 =mongo_shell(A1,"scores.find(,   {_id:0})").fetch() / 获取 scores 数据
3 =A2.maxp@a(Scores.avg(Score)) / 根据最好的平均成绩返回记录
4 >A1.close() / 关闭连接
  2、调试执行一下,可看到格值 A2 为:
A2 StudentID Scores

S0001 [[Chinese ,75.0],[  Maths, 81.0],[English, 78.0]]
S0002 [[Chinese ,80.0],[  Maths, 78.0],[English, 76.0]]
S0003 [[Chinese ,78.0],[  Maths, 75.0],[English, 72.0]]
    3、执行脚本后, 格值 A3 为:
A3 StudentID Scores

S0001 [[Chinese ,75.0],[  Maths, 81.0],[English, 78.0]]
S0002 [[Chinese ,80.0],[  Maths, 78.0],[English, 76.0]]

若需要求各科成绩之和再取最大值或最小值,集算器也可类似实现。