標籤:mongodb 指令碼 數位 比較 集算器
Mongodb指令碼解決複雜問題的計算能力有限,直接使用時較為吃力。很多情況下需要將資料讀出後在主程式中進一步完成運算,而在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是一個數字串。每個數字串都要和另外所有的數字串比較,找出每個數字串的最大相同數和最大不同數。如果第1行和第n行都含有數字1,就算相同數有1個,如果第1行有1第n行沒有,就算不同數有1個。
集算器代碼如下:
A1:串連mongodb,ip和連接埠號碼是localhost:27017,資料庫是test,使用者名稱和密碼都是test。
A2:使用find函數從mongodb中取數,形成遊標。集合是test,過濾條件是空,鍵_id不取出。可以看出,esProc在find函數中採用了和mongdb的find語句一樣的參數格式。esProc的遊標支援分批讀取和處理資料,可以避免資料量過大,記憶體出現溢出的情況。這裡因為資料量不大,所以用fetch出遊標的所有記錄。
A3:在A2的基礎上增加兩列,用來存放最大相同數和最大不同數。同時把value轉成字串。
A4:針對A3集合迴圈,迴圈體是B4到D10。
B4:取當前迴圈的value。
C4:利用函數將value分拆成單個字元組成的序列,去掉重複的值。
B5:對A3再進行一次內層迴圈。迴圈體是C6到D10。
C5:如果內層迴圈的迴圈位置和外層當前位置的相等,也就是說是同一個value的話,就跳過本次內層迴圈,進行下一次內層迴圈。
C6:取得內層迴圈的value。
C7:定義兩個變數same和diff,分別存放本次比較的相同數和不同數,初始值為0。
C8:利用迴圈函數,在內層迴圈的value中逐個尋找外層迴圈的value分拆的序列數值。如果能找到,則same自加1,否則diff自加1。
C9、C10:將same和diff和A4中的same和diff比較,將較大的重新賦值給A4中的same和diff。
運行結果是:
需要說明的是:esProc並不包含mongodb的java驅動包。用esProc來訪問mongodb,必須提前將mongodb的java驅動包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到[esProc安裝目錄]\common\jdbc中。
esProc協助mongodb計算的指令碼很容易整合到java中,只要增加一行A11,寫成result A3即可向java輸出resultset形式的結果,具體的代碼參考esProc教程。同樣,用java調用esProc訪問mongodb也必須將mongdb的java驅動包放到java程式的classpath中。
集算器協助MongoDB計算之數位比較