原文链接:http://c.raqsoft.com.cn/article/1540877315505?r=alice
MongoDB属于 NoSql 中的基于分布式文件存储的文档型数据库,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。Mongo 最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,但是写起来并不简单。若能集算器 SPL 语言结合,处理起来就相对容易多了。
现在我们针对 MongoDB 在计算方面的问题进行讨论分析,通过集算器 SPL 语言加以改进,方便用户使用 MongoDB。现从如下情况加以说明:
1. 单表内嵌数组结构的统计............................................... 1
2. 单表内嵌文档求和......................................................... 3
3. 分段分组结构................................................................ 5
4. 同构表合并................................................................... 6
5. 关联嵌套结构情况 1...................................................... 8
6. 关联嵌套结构情况 2..................................................... 10
7. 关联嵌套结构情况 3..................................................... 11
8. 多字段分组统计........................................................... 14
9. 两表关联查询............................................................... 16
10. 多表关联查询............................................................. 17
11. 指定数组查找............................................................. 19
12. 关联表中的数组查找................................................... 20
1. 单表内嵌数组结构的统计
对嵌套数组结构中的数据统计处理。查询考试科目的平均分及每个学生的总成绩情况。
测试数据:
_id | name | sex | Scroe |
1 | Tom | F | [{"lesson":" Physics ","mark":60 }, |
2 | Jerry | M | [{"lesson":" Physics ","mark":92 }, |
期待统计结果:
Physics | 76 | Tom | 132 | |
Chemical | 72 | Jerry | 173 | |
Math | 81 |
脚本:
db.student.aggregate( [ {\$unwind : "\$scroe"}, {\$group: { "_id": {"lesson":"\$scroe.lesson"} , "qty":{"\$avg": "\$scroe.mark"} } } ] ) | db.student.aggregate( [ {\$unwind : "\$scroe"}, {\$group: { "_id": {"name" :"\$name"} , "qty":{"\$sum" : "\$scroe.mark"} } } ] ) |
由于各科分数 scroe 是按课目、成绩记录的数组结构,统计前需要将它拆解,将每科成绩与学生对应,然后再实现分组计算。这需要熟悉 unwind 与 group 组合的应用。
SPL 脚本:
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 |
脚本说明:
A1:连接 mongo 数据库。
A2:获取 student 表中的数据。
A3:将 scroe 数据合并成序表,再按课程分组,计算平均分。
A4:统计每个学生的成绩后返回列名为 NAME、TOTAL 的序表。new 函数表示生成新序表。
A5:关闭数据库连接。
这个比较常用嵌套结构统计的例子许多人遭遇过、需要先拆解,主要是熟悉 mongodb 对嵌套数据结构的处理。
更多细节可看原文:http://c.raqsoft.com.cn/article/1540877315505?r=alice
作者:oradt
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。