溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

集算器協(xié)助MongoDB計算之?dāng)?shù)位比較

發(fā)布時間:2020-08-07 22:10:02 來源:網(wǎng)絡(luò) 閱讀:769 作者:datanalysis 欄目:MongoDB數(shù)據(jù)庫

  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行有1n行沒有,就算不同數(shù)有1個。

  集算器代碼如下:

集算器協(xié)助MongoDB計算之?dāng)?shù)位比較

A1:連接mongodbip和端口號是localhost:27017,數(shù)據(jù)庫是test,用戶名和密碼都是test

  A2:使用find函數(shù)從mongodb中取數(shù),形成游標(biāo)。集合是test,過濾條件是空,鍵_id不取出??梢钥闯?,esProcfind函數(shù)中采用了和mongdbfind語句一樣的參數(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)體是B4D10

B4:取當(dāng)前循環(huán)的value。

C4:利用函數(shù)將value分拆成單個字符組成的序列,去掉重復(fù)的值。

B5:對A3再進(jìn)行一次內(nèi)層循環(huán)。循環(huán)體是C6D10

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:定義兩個變量samediff,分別存放本次比較的相同數(shù)和不同數(shù),初始值為0。

C8:利用循環(huán)函數(shù),在內(nèi)層循環(huán)的value中逐個查找外層循環(huán)的value分拆的序列數(shù)值。如果能找到,則same自加1,否則diff自加1。

C9、C10:將samediffA4中的samediff比較,將較大的重新賦值給A4中的samediff

運行結(jié)果是:

集算器協(xié)助MongoDB計算之?dāng)?shù)位比較

需要說明的是:esProc并不包含mongodbjava驅(qū)動包。用esProc來訪問mongodb,必須提前將mongodbjava驅(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也必須將mongdbjava驅(qū)動包放到java程序的classpath中。




向AI問一下細(xì)節(jié)

免責(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)容。

AI