溫馨提示×

溫馨提示×

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

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

協(xié)助 MongoDB 計(jì)算之本地化排序

發(fā)布時間:2020-05-26 07:09:44 來源:網(wǎng)絡(luò) 閱讀:105 作者:raqsoft 欄目:大數(shù)據(jù)

軟件本地化,可讓用戶根據(jù)自己的語言環(huán)境、使用習(xí)慣來選擇不同的語言版本,從而最大限度提高使用體驗(yàn)。隨著軟件技術(shù)的進(jìn)步,本地化能力得到廣泛支持、不斷向前發(fā)展,也成為軟件成熟的重要標(biāo)志。本文討論的MongoDB本地化排序之路也是從無到有,一點(diǎn)點(diǎn)積累向前發(fā)展的。先前版本只能按照UNICODE編碼排序,而不是根據(jù)本地語言的編碼排序。后來版本增加了對本地化排序的支持,但它的前提是要在創(chuàng)建集合時進(jìn)行語言設(shè)置,否則無效,而且對已經(jīng)存儲了數(shù)據(jù)的集合也無效。通過集算器SPL語言結(jié)合MongoDB進(jìn)行操作則可以方便實(shí)現(xiàn)本地化語言的排序(例如:中文按照拼音排序),實(shí)現(xiàn)起來也非常容易。下面就用中文例子進(jìn)行說明:


???????集合person保存了姓名和性別如下:
> db.person.find()
{"_id" : ObjectId("544e4e070f03ad39eb2bf498"), "name" : "宋江","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf499"), "name" : "李逵","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf49a"), "name" : "吳用","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf49b"), "name" : "晁蓋","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf49c"), "name" : "公孫勝","gender":"男" }
{"_id" : ObjectId("544e4e070f03ad39eb2bf49d"), "name" : "魯智深","gender":"男" }
{"_id" : ObjectId("544e4e070f03ad39eb2bf49e"), "name" : "武松","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf49f"), "name" : "阮小二","gender":"男" }
{"_id" : ObjectId("544e4e070f03ad39eb2bf4a0"), "name" : "楊志","gender":"男"}
{"_id" : ObjectId("544e4e070f03ad39eb2bf4a1"), "name" : "孫二娘","gender":"女" }
{"_id" : ObjectId("544e4e070f03ad39eb2bf4a2"), "name" : "扈三娘","gender":"女" }
{"_id" : ObjectId("544e4e080f03ad39eb2bf4a3"), "name" : "燕青","gender":"男"}

???????直接用MongoDB的sort函數(shù),無法按照拼音排序:
> db.person.find({},{"name":1,"gender":1,"_id":0}).sort({"name":1})
{ "name" : "公孫勝","gender":"男" }
{ "name" : "吳用","gender":"男" }
{ "name" : "孫二娘","gender":"女" }
{ "name" : "宋江","gender":"男" }
{ "name" : "扈三娘","gender":"女" }
{ "name" : "晁蓋","gender":"男" }
{ "name" : "李逵","gender":"男" }
{ "name" : "楊志","gender":"男" }
{ "name" : "武松","gender":"男" }
{ "name" : "燕青","gender":"男" }
{ "name" : "阮小二","gender":"男" }
{ "name" : "魯智深","gender":"男" }

???????使用集算器 SPL 的代碼如下:

協(xié)助 MongoDB 計(jì)算之本地化排序 ? ? ?


A1:連接 MongoDB,連接字格式為 mongo://ip:port/db?arg=value&…。
A2:使用 find 函數(shù)從 person 中取數(shù),形成游標(biāo),過濾條件是空,指定鍵是 name 和 gender。SPL 的游標(biāo)是分批讀取和處理數(shù)據(jù),可以避免數(shù)據(jù)量過大,以防內(nèi)存溢出。
A3:因?yàn)閿?shù)據(jù)量不大,所以這里 fetch 出游標(biāo)的所有記錄。
A4:關(guān)閉連接。
A5:使用 sort 按照字段 name 以中文拼音方式升序排序。
運(yùn)行的結(jié)果如下:
???????協(xié)助 MongoDB 計(jì)算之本地化排序?

?????? sort排序時,可根據(jù)需要設(shè)置成不同的語言,實(shí)現(xiàn)對查詢結(jié)果的排序。集算器SPL也支持其他本地化語言,見后面說明。


?????? 需要說明的是:集算器esProc并不包含mongodb的java驅(qū)動包。用esProc來訪問mongodb,必須提前將mongodb的java驅(qū)動包(例如:mongo-java-driver-2.12.2.jar)放到集算器設(shè)置的外部庫目錄extLib\MongoCli下。


?????? 除了在集算器中直接計(jì)算,上述使用SPL協(xié)助mongodb計(jì)算的腳本也很容易集成到j(luò)ava中,只要增加一行,寫成return A5即可向java輸出resultset形式的結(jié)果,具體的代碼參考esProc教程。同樣,用java調(diào)用esProc訪問mongodb也必須將mongdb的java驅(qū)動包放到j(luò)ava程序的classpath中。


???????MongoDB的 java 驅(qū)動包下載地址是:
???????https://github.com/MongoDB/mongo-java-driver/releases。

???????集算器 SPL 支持的語言包括:


協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序協(xié)助 MongoDB 計(jì)算之本地化排序



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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI