標籤: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}來調用。
用Jasper Report製作Mongodb join Mysql的報表例子