玩转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. 单表内嵌数组结构的统计

对嵌套数组结构中的数据统计处理。查询考试科目的平均分及每个学生的总成绩情况。
测试数据:

_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      

脚本:

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
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(大数据,数据库计算,数据库计算)