多样性和多数据源问题使用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}来调用。
相关推荐
- **报表系统**:支持复杂的查询和数据分析,适用于构建高性能的报表系统。 - **海量数据实时查询**:通过分布式架构,实现对大规模数据集的有效查询。 #### 二、MyCAT环境准备 在准备MyCAT环境之前,我们需要明确...
1. 数据库类型:分为关系型数据库(如SQL Server、MySQL)、非关系型数据库(如MongoDB、Cassandra)等。关系型数据库基于E.F. Codd的关系模型,通过表格形式存储数据,支持ACID(原子性、一致性、隔离性、持久性)...
数据库是一种有组织地存储数据的系统,它可以是关系型的,如MySQL、PostgreSQL、Oracle,或者是非关系型的,如MongoDB、Cassandra。关系型数据库基于表格模型,数据以表格的形式存储,每个表格由行和列组成,代表...
1. 数据库与数据表:数据库是一个组织和存储数据的系统,它可以是关系型数据库(如MySQL、Oracle、SQL Server)或者是非关系型数据库(如MongoDB、Cassandra)。数据表是数据库中的基本单元,类似于电子表格,包含一...
DbVisualizer是一款强大的数据库管理工具,它被广泛用于多种数据库系统的可视化操作,包括但不限于Oracle、MySQL、PostgreSQL、SQL Server、IBM DB2等。这款工具以其跨平台的特性、全面的功能集以及用户友好的界面而...
常见的数据库类型包括关系型数据库(如MySQL, Oracle, Microsoft SQL Server)、NoSQL数据库(如MongoDB, Cassandra)以及云数据库服务(如Amazon RDS, Google Cloud SQL)。DatabaseNet支持这些不同的数据库系统,...
在IT行业中,将数据从数据库导出并存储到Excel表格是一项常见的任务,尤其在数据分析、报表制作和数据共享等场景中。以下是对这个主题的详细解释: 首先,我们需要理解数据库和Excel之间的基本概念。数据库是一种...
1. **数据库基础**:讲解数据库是什么,为什么我们需要它,以及常见的数据库管理系统(如MySQL、Oracle、SQL Server、MongoDB)的区别。 2. **关系型数据库**:详细介绍如何设计关系模型,使用E-R图表示实体与关系,...
常见的数据库管理系统(DBMS)有MySQL、Oracle、SQL Server、MongoDB等。这些系统提供了SQL(Structured Query Language)这样的标准语言,用于查询、更新和操作数据。在“数据库讲义及ppt”中,可能会涵盖数据库的...
更高级的SQL技术包括子查询、窗口函数、聚合函数和分组,这些都是数据分析和报表制作的基础。 数据库性能优化是提升系统效率的关键。这可能涉及索引的创建和管理,以加快查询速度;使用存储过程和触发器来封装复杂...
常见的数据库类型包括关系型数据库(如MySQL, PostgreSQL)、非关系型数据库(如MongoDB, Redis)以及分布式数据库等。 2. SQL语言:SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。...
1. **数据库基础知识**:首先,我们需要理解数据库的基本概念,如关系型数据库(如MySQL、PostgreSQL)、非关系型数据库(如MongoDB、Redis)以及数据库设计原则,如范式理论(1NF, 2NF, 3NF)等。在"bosstime_db"中...