对于本地化语言(例如:中文),MongoDB是按照UNICODE编码排序,而不是根据本地语言的编码排序。用esProc结合MongoDB可以方便的实现本地化语言的排序(例如:中文按照拼音排序)。下面我们以中文为例,来看一下具体做法。

MongoDB中的集合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" : ""}

直接用MongoDBsort函数,没有按照拼音排序:

>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" : "" }

 

esProc协助MongoDB的脚本如下:

集算器协助MongoDB计算之本地化排序_mongodb

    A1:连接MongoDBip和端口号是localhost:27017,数据库是test,用户名和密码都是test。如果需要其他参数的话可以按照mongo://ip:port/db?arg=value&…格式继续写参数。

    A2:使用find函数从MongoDB中取数,形成游标。集合是person,过滤条件是空,指定键是namegender。可以看出find函数和mongdbfind函数类似。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。

A3:因为数据量不大,所以这里fetch出游标的所有记录。

A4:使用sort按照name升序排序。排序所使用的语言是中文。集算器支持的其他本地化语言,见后。

运行的结果是:

集算器协助MongoDB计算之本地化排序_本地化排序_02

需要说明的是:esProc并不包含MongoDBjava驱动包。用esProc来访问MongoDB,必须提前将MongoDBjava驱动包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。

esProc协助MongoDB计算的脚本很容易集成到java中,只要增加一行A5,写成result A4即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问MongoDB也必须将mongdbjava驱动包放到java程序的classpath中。

MongoDBjava驱动包下载地址是:

https://github.com/MongoDB/mongo-java-driver/releases

esProc支持的语言包括:

ja_JP       日文  日本

es_PE     西班牙文  秘鲁

en            英文

ja_JP_JP   日文         日本

es_PA     西班牙文  巴拿马

sr_BA     塞尔维亚文       波斯尼亚和黑山共和国

mk           马其顿文

es_GT    西班牙文  危地马拉

ar_AE     阿拉伯文  阿拉伯联合酋长国

no_NO   挪威文       挪威

sq_AL     阿尔巴尼亚文  阿尔巴尼亚

bg            保加利亚文

ar_IQ      阿拉伯文  伊拉克

ar_YE     阿拉伯文  也门

hu            匈牙利文

pt_PT     葡萄牙文  葡萄牙

el_CY      希腊文       塞浦路斯

ar_QA    阿拉伯文  卡塔尔

mk_MK  马其顿文  马其顿王国

sv            瑞典文

de_CH    德文  瑞士

en_US    英文  美国

fi_FI        芬兰文       芬兰

is             冰岛文

cs            捷克文

en_MT   英文  马耳他

sl_SI        斯洛文尼亚文  斯洛文尼亚

sk_SK      斯洛伐克文       斯洛伐克

it              意大利文

tr_TR      土耳其文  土耳其

zh            中文

th            泰文

ar_SA     阿拉伯文  沙特阿拉伯

no            挪威文

en_GB    英文  英国

sr_CS      塞尔维亚文       塞尔维亚及黑山

lt              立陶宛文

ro            罗马尼亚文

en_NZ    英文  新西兰

no_NO_NY       挪威文     挪威

lt_LT       立陶宛文  立陶宛

es_NI     西班牙文  尼加拉瓜

nl             荷兰文

ga_IE      爱尔兰文  爱尔兰

fr_BE      法文  比利时

es_ES     西班牙文  西班牙

ar_LB     阿拉伯文  黎巴嫩

ko            朝鲜文

fr_CA      法文  加拿大

et_EE     爱沙尼亚文       爱沙尼亚

ar_KW    阿拉伯文  科威特

sr_RS      塞尔维亚文       塞尔维亚

es_US     西班牙文  美国

es_MX   西班牙文  墨西哥

ar_SD     阿拉伯文  苏丹

in_ID      印度尼西亚文  印度尼西亚

ru            俄文

lv             拉托维亚文(列托)

es_UY    西班牙文  乌拉圭

lv_LV       拉托维亚文(列托)    拉脱维亚

iw            希伯来文

pt_BR     葡萄牙文  巴西

ar_SY      阿拉伯文  叙利亚

hr            克罗地亚文

et            爱沙尼亚文

es_DO    西班牙文  多米尼加共和国

fr_CH     法文  瑞士

hi_IN      印地文       印度

es_VE     西班牙文  委内瑞拉

ar_BH    阿拉伯文  巴林

en_PH    英文  菲律宾

ar_TN     阿拉伯文  突尼斯

fi              芬兰文

de_AT     德文  奥地利

es            西班牙文

nl_NL      荷兰文       荷兰

es_EC     西班牙文  厄瓜多尔

zh_TW   中文  台湾地区

ar_JO     阿拉伯文  约旦

be            白俄罗斯文

is_IS        冰岛文       冰岛

es_CO    西班牙文  哥伦比亚

es_CR    西班牙文  哥斯达黎加

es_CL     西班牙文  智利

ar_EG     阿拉伯文  埃及

en_ZA    英文  南非

th_TH     泰文  泰国

el_GR     希腊文       希腊

it_IT        意大利文  意大利

ca            加泰罗尼亚文

hu_HU   匈牙利文  匈牙利

fr             法文

en_IE      英文  爱尔兰

uk_UA    乌克兰文  乌克兰

pl_PL      波兰文       波兰

fr_LU      法文  卢森堡

nl_BE      荷兰文       比利时

en_IN     英文  印度

ca_ES     加泰罗尼亚文  西班牙

ar_MA   阿拉伯文  摩洛哥

es_BO    西班牙文  玻利维亚

en_AU    英文  澳大利亚

sr             塞尔维亚文

zh_SG     中文  新加坡

pt            葡萄牙文

uk            乌克兰文

es_SV     西班牙文  萨尔瓦多

ru_RU    俄文  俄罗斯

ko_KR     朝鲜文       韩国

vi             越南文

ar_DZ     阿拉伯文  阿尔及利亚

vi_VN     越南文       越南

sr_ME    塞尔维亚文       黑山

sq            阿尔巴尼亚文

ar_LY      阿拉伯文  利比亚

ar            阿拉伯文

zh_CN    中文  中国

be_BY    白俄罗斯文       白俄罗斯

zh_HK    中文  香港

ja             日文

iw_IL      希伯来文  以色列

bg_BG    保加利亚文       保加利亚

in             印度尼西亚文

mt_MT  马耳他文  马耳他

es_PY     西班牙文  巴拉圭

sl             斯洛文尼亚文

fr_FR      法文  法国

cs_CZ     捷克文       捷克共和国

it_CH      意大利文  瑞士

ro_RO    罗马尼亚文       罗马尼亚

es_PR     西班牙文  波多黎哥

en_CA    英文  加拿大

de_DE    德文  德国

ga            爱尔兰文

de_LU    德文  卢森堡

de            德文

es_AR    西班牙文  阿根廷

sk            斯洛伐克文

ms_MY  马来文       马来西亚

hr_HR    克罗地亚文       克罗地亚

en_SG    英文  新加坡

da            丹麦文

mt           马耳他文

pl             波兰文

ar_OM   阿拉伯文  阿曼

tr             土耳其文

th_TH_TH         泰文         泰国

el             希腊文

ms           马来文

sv_SE      瑞典文       瑞典

da_DK    丹麦文       丹麦

es_HN    西班牙文  洪都拉斯