MongoDB等nosql数据库具有易扩展和高性能等优势,但计算能力比传统SQL要弱,例如MongoDB的分组结果不能太大,且不直接支持join运算等,而集算报表内置的计算引擎再正好可以补充这一点,在获得MongoDB的优势的同时还拥有较强的计算能力。
我们通过一个分组实例来了解一下集算报表使用MongoDB数据源开发报表的过程。
报表说明
学生成绩信息存储在MongoDB中,包含班级、姓名、成绩、科目等信息,成绩表(score)数据内容如下:

<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICDP1rj5vt3Rp8n60MXPorvj19zX3LPJvKijrLKixcXD+6Gj0tTPws6qyrXP1rK91uijujwvcD4KPGgyPte8sbhNb25nb0RCIGpkYmPH/bavsPw8L2gyPgo8cD4gICAgICAgICDV4sDvyrnTw7XEysfX7tDCsOZNb25nb0RCMi42LjSjrNPJ09q8r8vjsaix7bKisruw/LqsTW9uZ29EQrXEamF2Ycf9tq+w/KGj08O8r8vjsaix7cC0t8POyk1vbmdvREKjrLHY0OvM4cew17yxuE1vbmdvREK1xGphdmHH/bavsPyjqLyvy+OxqLHt0qrH8zIuMTIuMrvy0tTJz7Dmsb61xMf9tq+jrMjnbW9uZ28tamF2YS1kcml2ZXItMi4xMi4yLmphcqOpoaM8L3A+CjxwPiAgICAgICAg08nT2tKqyrnTw7yvy+PG97HgvK28xsvjvcWxvqOsyrnTw7yvy+OxqLHtyei8xsb3zeqzybGose3Eo7Dl1sbX96Osy/nS1NDo0qq9q9LUyc+w/LfFtb1bvK/L47Gose26zbyvy+PG97Cy17DEv8K8XVxjb21tb25camRiY8/Co6h3ZWKyv8rwyrG3xbW906bTw7XEY2xhc3NwYXRo1tCjqaGjTW9uZ29EQrXEamF2Ycf9tq+w/M/C1Ni12Na3ysejumh0dHBzOi8vZ2l0aHViLmNvbS9Nb25nb0RCL21vbmdvLWphdmEtZHJpdmVyL3JlbGVhc2VzoaM8L3A+CjxoMj6x4NC0vMbL473Fsb48L2gyPgo8cD4gICAgICAgICDKudPDvK/L48b3seC8rcb3seDQtLyvy+O9xbG+o6yjqHAxLmRmeKOpo6zN6rPJse3K/b7dtsHIobzGy+OjrM6qsaix7be1u9i94bn7vK+jqNPSsuDOqiYjMjY2ODQ719PUy9DQuvO94bn7o6mhozwvcD4KCjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/57/1_hbpem__.jpg" alt="\">
A1:连接MongoDB,ip和端口号是localhost:27017,数据库是test,用户名和密码为空。如果需要其他参数的话可以按照mongo://ip:port/db?user=…&password=…格式继续写参数。
A2:使用find函数从MongoDB中取数,形成游标。集合是score,取出除_id外的所有字段。可以看出find函数和MongoDB的find函数类似。集算器的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。
A3:关闭连接。
A4:按照id字段分组。
A5:汇总总成绩。
A6:按总成绩排名,为报表返回结果集。
编辑报表模板
首先在集算报表设计器中新建报表,设置数据集,使用“集算器”数据集类型,调用编辑好的脚本文件(p1.dfx)。
其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。
编辑报表表达式,直接使用集算脚本返回的结果集,不再在报表中分组排序,完成报表制作
在设计器中预览报表,可得到如下结果:
通过上面的实现可以看到,使用集算器脚本可以方便地完成MongoDB数据读取计算,而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。
在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的参数。使用脚本数据集可以这样完成:
1、在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;
2、在弹出的脚本数据集编辑窗口中编写脚本;
3、报表表达式,与使用集算器数据集一致,不再赘述。