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。部分源数据如下:
Collection emp1
table cities
集算器脚本:
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的emp1 collection中查询出某时间段的记录。函数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}来调用。
上一篇: 数据库各种join的区别
下一篇: Join语句