您好,登錄后才能下訂單哦!
Mongodb腳本解決復(fù)雜問題的計算能力有限,直接使用時較為吃力。很多情況下需要將數(shù)據(jù)讀出后在主程序中進(jìn)一步完成運算,而在Java等高級語言中編寫這類集合式運算也比較麻煩。這時可以用集算器esProc來輔助,這里通過一個例子來說明。
Mongodb中有一個test集合如下:
>db.test.find({},{"_id":0})
{"value" : NumberLong(112937552) }
{"value" : NumberLong(715634640) }
{"value" : NumberLong(487229712) }
{"value" : NumberLong(79198330) }
{"value" : NumberLong(440998943) }
{"value" : NumberLong(93148782) }
{"value" : NumberLong(553008873) }
{"value" : NumberLong(336369168) }
{"value" : NumberLong(369669461) }
…
具體的:test集合包含多個value,每個value是一個數(shù)字串。每個數(shù)字串都要和另外所有的數(shù)字串比較,找出每個數(shù)字串的最大相同數(shù)和最大不同數(shù)。如果第1行和第n行都含有數(shù)字1,就算相同數(shù)有1個,如果第1行有1第n行沒有,就算不同數(shù)有1個。
集算器代碼如下:
A1:連接mongodb,ip和端口號是localhost:27017,數(shù)據(jù)庫是test,用戶名和密碼都是test。
A2:使用find函數(shù)從mongodb中取數(shù),形成游標(biāo)。集合是test,過濾條件是空,鍵_id不取出??梢钥闯?,esProc在find函數(shù)中采用了和mongdb的find語句一樣的參數(shù)格式。esProc的游標(biāo)支持分批讀取和處理數(shù)據(jù),可以避免數(shù)據(jù)量過大,內(nèi)存出現(xiàn)溢出的情況。這里因為數(shù)據(jù)量不大,所以用fetch出游標(biāo)的所有記錄。
A3:在A2的基礎(chǔ)上增加兩列,用來存放最大相同數(shù)和最大不同數(shù)。同時把value轉(zhuǎn)成字符串。
A4:針對A3集合循環(huán),循環(huán)體是B4到D10。
B4:取當(dāng)前循環(huán)的value。
C4:利用函數(shù)將value分拆成單個字符組成的序列,去掉重復(fù)的值。
B5:對A3再進(jìn)行一次內(nèi)層循環(huán)。循環(huán)體是C6到D10。
C5:如果內(nèi)層循環(huán)的循環(huán)位置和外層當(dāng)前位置的相等,也就是說是同一個value的話,就跳過本次內(nèi)層循環(huán),進(jìn)行下一次內(nèi)層循環(huán)。
C6:取得內(nèi)層循環(huán)的value。
C7:定義兩個變量same和diff,分別存放本次比較的相同數(shù)和不同數(shù),初始值為0。
C8:利用循環(huán)函數(shù),在內(nèi)層循環(huán)的value中逐個查找外層循環(huán)的value分拆的序列數(shù)值。如果能找到,則same自加1,否則diff自加1。
C9、C10:將same和diff和A4中的same和diff比較,將較大的重新賦值給A4中的same和diff。
運行結(jié)果是:
需要說明的是:esProc并不包含mongodb的java驅(qū)動包。用esProc來訪問mongodb,必須提前將mongodb的java驅(qū)動包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到[esProc安裝目錄]\common\jdbc中。
集算器esProc協(xié)助mongodb計算的腳本很容易集成到java中,只要增加一行A11,寫成result A3即可向java輸出resultset形式的結(jié)果,具體的代碼參考esProc教程。同樣,用java調(diào)用esProc訪問mongodb也必須將mongdb的java驅(qū)動包放到java程序的classpath中。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。