用Jasper Report制作Mongodb join Mysql的报表例子

         多样性和多数据源问题使用JasperReport等报表工具本身不易处理,比如展现MongoDB和mysql的混合运算。虽然JasperReport/Birt有virtual data source或table join等功能,但只在商业版或高端版本出现,在免费版中实现难度很大,而且功能也有较大局限,无法对连接后的数据进行类似SQL的结构化计算。

         集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明MongoDB join mysql的实现过程。

         Emp1是MongoDB的collection,cities是 mysql的table,emp1中的字段CityID逻辑上相当于外键,指向cities的CityID字段,cities有CityID和CityName这两个字段。现在需要按时间段查询出Emp1中的员工,并将CityID显示为CityName。部分源数据如下:

         Collectionemp1

技术分享

         tablecities

技术分享

         集算器脚本:

技术分享

         A1=MongoDB("mongo://localhost:27017/test?user=root&password=sa")

         上述代码用来创建MongoDB的数据库连接,可用user和password来指定用户名和密码。

         集算器也支持用JDBC方式连接MongoDB,用法和普通数据库一样,但由于第三方JDBC功能上不如官方库函数,比如无法获取多层数据,因此集算器直接封装原生方法,MongoDB的功能和语法都被保留,比如可以在此基础上使用find函数,

A2=A1.find("emp1","{‘$and‘:[{‘Birthday‘:{‘$gte‘:‘"+string(begin)+"‘}},{‘Birthday‘:{‘$lte‘:‘"+string(end)+"‘}}]}","{_id:0}").fetch()

        上述代码从MongoDB的emp1collection中查询出某时间段的记录。函数find的第一个参数是collection名,第二个参数是查询条件,遵循MongoDB规范,第三个参数限定返回的字段。注意查询条件中的begin和end是来自报表的外部参数,分别表示Birthday的起始时间和终止时间。

        函数find返回的是游标,并不会把数据直接读入内存,因此支持大数据量。可以用skip、sort、conj等函数继续操作游标,直到遇到函数fetch、groups,或语句for时才会真正取数。本例直接用函数fetch()将数据读入内存,假如时间段是1976-01-01到1988-12-31,则A2的计算结果如下:

技术分享

        A3=A1.close()

       上述代码用来关闭A1中的数据库连接。

        A4=myDB1.query("select * from cities")

        上述代码执行SQL,从mysql数据源取数。其中myDB1是数据源名称,配置界面如下:

技术分享

        可以看到,这里的数据源使用的就是JDBC连接,可支持任意数据库。JDBC数据源可以自动连接/关闭,也可以像MongoDB那样手工连接/关闭,这里采用前者。

        函数query使用SQL语句进行检索查询,结果如下:

技术分享

        A5=A2.switch(CityID,A4)

        上述代码将A2中的CityID字段替换成A4中对应的记录,其效果类似于左连接。替换后的A2如下(A2与A5指向同一个二维表):

技术分享

        点击CityID中蓝色的超链接,可以看到对应的记录:

技术分享

        有时需要进行内连接,则应当在函数swtich中使用选项@i,代码即:A2.switch@i(CityID,A4)结果将会如下:

技术分享

        A6=A5.new(EID,Dept,CityID.CityName:CityName,Name,Gender)

        A5执行连接操作,A6则从连接的结果中取出需要的字段,并用函数new组成二维表。其中CityID.CityName:CityName表示从A5取出CityID字段对应的记录中的CityName字段,并重命名为CityName(报表工具无法识别CityID.CityName这样的字段名)。

        从上述代码可以看出,用switch替换字段后,表之间的关联关系就可以用对象的方式来访问,这种方式直观简单,进行多表多层关联时会体现得更明显。

        A6的计算结果如下:

技术分享

        到此为止,报表需要的数据就全部计算出来了。最后只需用result A6将A6中的二维表返回报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

 

        接下来以JasperReport为例设计报表,表样如下:

技术分享

         需要定义两个报表参数Pbegin、Pend,分别对应集算器中的两个参数。预览后可以看到报表结果:

技术分享

         报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为mongodbJoin2.dfx,则在JasperReport的SQL设计器中可以用mongodbJoin2 $P{pbegin},$P{pend}来调用。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。