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

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

_idnamesexScroe
1TomF

[{"lesson":" Physics ","mark":60   },
  {"lesson":" Chemical ","mark":72 }]

2JerryM

[{"lesson":" Physics ","mark":92   },
  {"lesson":" Math ","mark":81 }]

期待统计结果:

Physics76 Tom132
Chemical72 Jerry173
Math81   

脚本:

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 脚本:

 AB
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() 

按课目统计的总分数

LESSONAVG
Chemical72.0
Math81.0
Physics76.0

每个学生的总成绩

NAMETOTAL
Tom132
Jerry173

脚本说明:
      A1:连接 mongo 数据库。
      A2:获取 student 表中的数据。
      A3:将 scroe 数据合并成序表,再按课程分组,计算平均分。
      A4:统计每个学生的成绩后返回列名为 NAME、TOTAL 的序表。new 函数表示生成新序表。
      A5:关闭数据库连接。
 
这个比较常用嵌套结构统计的例子许多人遭遇过、需要先拆解,主要是熟悉 mongodb 对嵌套数据结构的处理。


更多细节可看原文:http://c.raqsoft.com.cn/article/1540877315505?r=alice


作者:oradt
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值