MongoDB等nosql数据库具有易扩展和高性能等优势,但计算能力比传统SQL要弱,例如MongoDB的分组结果不能太大,且不直接支持join运算等,而集算报表内置的计算引擎再正好可以补充这一点,在获得MongoDB的优势的同时还拥有较强的计算能力。
我们通过一个分组实例来了解一下集算报表使用MongoDB数据源开发报表的过程。
报表说明
学生成绩信息存储在MongoDB中,包含班级、姓名、成绩、科目等信息,成绩表(score)数据内容如下:
现根据学生信息汇总总成绩,并排名。以下为实现步骤:
准备MongoDB jdbc驱动包
这里使用的是最新版MongoDB2.6.4,由于集算报表并不包含MongoDB的java驱动包。用集算报表来访问MongoDB,必须提前准备MongoDB的java驱动包(集算报表要求2.12.2或以上版本的驱动,如mongo-java-driver-2.12.2.jar)。
由于要使用集算器编辑计算脚本,使用集算报表设计器完成报表模板制作,所以需要将以上包放到[集算报表和集算器安装目录]\common\jdbc下(web部署时放到应用的classpath中)。MongoDB的java驱动包下载地址是:https://github.com/MongoDB/mongo-java-driver/releases。
编写计算脚本
使用集算器编辑器编写集算脚本,(p1.dfx),完成表数据读取计算,为报表返回结果集(右侧为格子运行后结果)。
A1:连接MongoDB,ip和端口号是localhost:27017,数据库是test,用户名和密码为空。如果需要其他参数的话可以按照mongo://ip:port/db?user=…&password=…格式继续写参数。
A2:使用find函数从MongoDB中取数,形成游标。集合是score,取出除_id外的所有字段。可以看出find函数和MongoDB的find函数类似。集算器的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。
A3:关闭连接。
A4:按照id字段分组。
A5:汇总总成绩。
A6:按总成绩排名,为报表返回结果集。
编辑报表模板
首先在集算报表设计器中新建报表,设置数据集,使用“集算器”数据集类型,调用编辑好的脚本文件(p1.dfx)。
其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。
编辑报表表达式,直接使用集算脚本返回的结果集,不再在报表中分组排序,完成报表制作
在设计器中预览报表,可得到如下结果:
通过上面的实现可以看到,使用集算器脚本可以方便地完成MongoDB数据读取计算,而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。
在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的参数。使用脚本数据集可以这样完成:
1、在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;
2、在弹出的脚本数据集编辑窗口中编写脚本;
3、报表表达式,与使用集算器数据集一致,不再赘述。