用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,代码即:[email protected](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}来调用。

时间: 2024-11-06 12:10:26

用Jasper Report制作Mongodb join Mysql的报表例子的相关文章

报表示例——用Jasper report实现MongoDB join

多样性数据源是报表开发的常见问题,但用JasperReport等报表工具本身难以处理,比如展现两个MongoDB collection连接的结果.虽然JasperReport有virtual data source或table join,但这些功能只在商业版或高端版本出现,在免费版中实现的难度很大.而且这些功能只支持两个数据源的连接,要实现多连接则麻烦得多.另外,这些功能只是图形化界面,无法对连接后的数据进行类似SQL的结构化计算. 集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协

Jasper Report (2)--- 用JDBC做为数据源

用JDBC做为jasper report的数据源来连接数据库读取数据 1. 在Eclipse中新建Java项目(过程略),我的Java项目的结构如下所示: 注:这里的有关spring的jar包并不是改项目运行必须的,是我在做用JavaBean做为数据源的时候用到的包,请忽略. 2.连接数据库代码(我连接的是Mysql数据库) 1 package com.report.sample; 2 3 import java.sql.Connection; 4 import java.sql.DriverM

MongoDB和MySQL的区别

前言: MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 一.关系型数据库-MySQL 1.在不同的引擎上有不同的存储方式.2.查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高.3.开源数据库的份额在不断增加,mysql的份额页在持续

mongodb与mysql的命令对比

mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象(document)三个层次组成.MongoDB对于关系型数据库里的表,但是集合中没有列.行和关系概念,这体现了模式自由的特点. MySQL MongoDB 说明 mysqld mongod 服务器守护进程 mysql mongo 客户端工具 mysqldump mongo

MongoDB与MySQL对比

MongoDB语法 MySql语法 db.test.find({'name':'foobar'}) <==> select * from test where name='foobar' db.test.find() <==> select * from test db.test.find({'ID':10}).count() <==> select count(*) from test where ID=10 db.test.find().skip(10).limit

MongoDB与Mysql常用命令解释

原文 本文旨在介绍MongoDB,Mysql的常用命令:将MongoDB 和传统的关系型数据库的常用命令对照起来学习,更加便于记忆和理解. mongodb与mysql命令对比 MongoDB是由数据库(database/repository).集合(collection).文档对象(document)三个层次组成.MongoDB中集合对应关系型数据库里的表,但是集合中没有列.行和关系的概念,这体现了模式自由的特点. 传统的关系数据库一般由数据库(database).表(table).记录(rec

MongoDB与MySQL的插入、查询性能测试

1.1  MongoDB的简单介绍 在当今的数据库市场上,MySQL无疑是占有一席之地的.作为一个开源的关系型数据库,MySQL被大量应用在各大网站后台中,承担着信息存储的重要作用.2009年,甲骨文公司(Oracle)收购Sun公司,MySQL成为Oracle旗下产品. 而MongoDB是一种文件导向的数据库管理系统,属于一种通称为NoSQL的数据库,是10gen公司旗下的开源产品,其内部数据存储的方式与传统的关系型数据有很大差别. NoSQL的全称是Not Only SQL,也可以理解非关系

MongoDB与MySQL的操作对比表及区别介绍

MongoDB与MySQL的操作对比表及区别介绍 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Orac

MongoDB 和 mySql 的关系

1. mysql 和 MongoDb MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过 SQLServer,Oracle,DB