MongoDB数据库计算
可阅读原文: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. 单表内嵌数组结构的统计 对嵌套数组结构中的数据统计处理。查询考试科目的平均分及每个学生的总成绩情况。
测试数据: [table=548]
[td=47]_id [td=47]name [td=25]sex [td=275]Scroe
[td=47]1 [td=47]Tom [td=25]F [td=275] [{"lesson":" Physics ","mark":60 },
{"lesson":" Chemical ","mark":72 }]
[td=47]2 [td=47]Jerry [td=25]M [td=275] [{"lesson":" Physics ","mark":92 },
{"lesson":" Math ","mark":81 }]
期待统计结果: [table=548]
[td=69]Physics [td=64]76 [td=267]
[td=56]Tom [td=91]132
[td=69]Chemical [td=64]72 [td=267]
[td=56]Jerry [td=91]173
[td=69]Math [td=64]81 [td=267]
[td=56]
[td=91]
脚本: [table=548]
[td=274]db.student.aggregate( [
{\$unwind : "\$scroe"},
{\$group: {
"_id": {"lesson":"\$scroe.lesson"} ,
"qty":{"\$avg": "\$scroe.mark"}
}
}
] ) [td=274]db.student.aggregate( [
{\$unwind : "\$scroe"},
{\$group: {
"_id": {"name" :"\$name"} ,
"qty":{"\$sum" : "\$scroe.mark"}
}
}
] )
由于各科分数 scroe 是按课目、成绩记录的数组结构,统计前需要将它拆解,将每科成绩与学生对应,然后再实现分组计算。这需要熟悉 unwind 与 group 组合的应用。 SPL 脚本:
[table=550]
[td=20]
[td=417]A [td=75]B
[td=20]1 [td=417]=mongo_open("mongodb://127.0.0.1:27017/raqdb") [td=75]
[td=20]2 [td=417]=mongo_shell(A1,"student.find()").fetch() [td=75]
[td=20]3 [td=417]=A2.conj(scroe).groups(lesson:LESSON;avg(mark):AVG) [td=75]
[td=20]4 [td=417]=A2.new(name:NAME,scroe.sum(mark):TOTAL) [td=75]
[td=20]5 [td=417]>A1.close() [td=75]
按课目统计的总分数
[table=314]
[td=154]LESSON [td=161]AVG
[td=154]Chemical [td=161]72.0
[td=154]Math [td=161]81.0
[td=154]Physics [td=161]76.0
每个学生的总成绩
[table=314]
[td=154]NAME [td=161]TOTAL
[td=154]Tom [td=161]132
[td=154]Jerry [td=161]173
脚本说明:
A1:连接 mongo 数据库。
A2:获取 student 表中的数据。
A3:将 scroe 数据合并成序表,再按课程分组,计算平均分。
A4:统计每个学生的成绩后返回列名为 NAME、TOTAL 的序表。new 函数表示生成新序表。
A5:关闭数据库连接。
这个比较常用嵌套结构统计的例子许多人遭遇过、需要先拆解,主要是熟悉 mongodb 对嵌套数据结构的处理。
后面具体的处理方式可点击看原文:http://c.raqsoft.com.cn/article/1540877315505?r=alice
作者:oradt
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。