【摘要】
MongoDB 在进行分组统计时如果面对一些比较复杂的计算情况,往往会遇到 shell 脚本过于复杂的问题。而集算器 SPL 语言,则因其有丰富的函数库及易用性恰好能弥补 Mongo 这方面的不足。若想了解更多,请前往乾学院:MongoDB 分组统计!
MongoDB 作为 NoSql 文档型数据库,在全球范围得到广泛的支持与应用。在比较常用的数据库功能中,相对于普通的增删改查,使用 group 聚合分组统计有些复杂,而 MongoDB 也给予了支持。本文将对MongoDb分组的实现方法及示例进行分析,通过在 MongoDB 脚本中操作、使用集算器 SPL 语言操作两种操作途径,进行简单的归纳总结。具体的问题场景包括以下几个方面:
1. 内嵌数组结构的统计
2. 内嵌文档求和
3. 分段分组结构统计
4. 多字段分组统计
1. 内嵌数组结构的统计
对嵌套数组结构中的数据进行统计处理例如查询考试科目的平均分及每个学生的总成绩:
测试数据:
_id | name | sex | Scroe |
1 | Tom | F | [{"lesson":" Physics","mark":60 }, {"lesson":" Chemical","mark":72 }] |
2 | Jerry | M | [{"lesson":" Physics","mark":92 }, {"lesson":" Math","mark":81 }] |
期待统计结果:
Physics | 76 | Tom | 132 | |
Chemical | 72 | Jerry | 173 | |
Math | 81 |
Mongodb脚本:
db.student.aggregate( [ |
db.student.aggregate( [ |
由于各科分数 scroe 是按课目、成绩记录的数组结构,统计前需要将它拆解,将每科成绩与学生对应,然后再实现分组计算。这需要熟悉 unwind 与 group 组合的应用。
SPL 脚本 (student.dfx):
A | B | |
1 | =mongo_open("mongodb://127.0.0.1:27017/raqdb") | |
2 | =mongo_shell(A1,"student.find()").fetch() | |
3 | =A2.conj(scroe).groups(lesson:LESSON;avg(mark):AVG) | |
4 | =A2.new(name:NAME,scroe.sum(mark):TOTAL) | |
5 | >A1.close() |
按课目统计的总分数:
LESSON | AVG |
Chemical | 72.0 |
Math | 81.0 |
Physics | 76.0 |
每个学生的总成绩:
NAME | TOTAL |
Tom | 132 |
Jerry | 173 |