用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}来调用。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值