协助 MongoDB 计算之本地化排序

软件本地化,可让用户根据自己的语言环境、使用习惯来选择不同的语言版本,从而最大限度提高使用体验。随着软件技术的进步,本地化能力得到广泛支持、不断向前发展,也成为软件成熟的重要标志。本文讨论的MongoDB本地化排序之路也是从无到有,一点点积累向前发展的。先前版本只能按照UNICODE编码排序,而不是根据本地语言的编码排序。后来版本增加了对本地化排序的支持,但它的前提是要在创建集合时进行语言设置,否则无效,而且对已经存储了数据的集合也无效。通过集算器SPL语言结合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":"男"}

       直接用MongoDB的sort函数,无法按照拼音排序:
> 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 的代码如下:

 A 
1=mongo_open("mongodb://localhost:27017/local?user=test&password=test") 
2=mongo_shell(A1,"person.find(,{name:1,gender:1,_id:0})") 
3=A2.fetch() 
4=mongo_close(A1) 
5=A3.sort(name:1;"zh") 

A1:连接 MongoDB,连接字格式为 mongo://ip:port/db?arg=value&…。
A2:使用 find 函数从 person 中取数,形成游标,过滤条件是空,指定键是 name 和 gender。SPL 的游标是分批读取和处理数据,可以避免数据量过大,以防内存溢出。
A3:因为数据量不大,所以这里 fetch 出游标的所有记录。
A4:关闭连接。
A5:使用 sort 按照字段 name 以中文拼音方式升序排序。
运行的结果如下:
        

       sort 排序时,可根据需要设置成不同的语言,实现对查询结果的排序。集算器SPL 也支持其他本地化语言,见后面说明。

 

       需要说明的是:集算器esProc并不包含mongodb的java驱动包。用esProc来访问mongodb,必须提前将mongodb的java驱动包(例如:mongo-java-driver-2.12.2.jar)放到集算器设置的外部库目录extLib\MongoCli下。

       除了在集算器中直接计算,上述使用SPL协助mongodb计算的脚本也很容易集成到java中,只要增加一行,写成return A5即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问mongodb也必须将mongdb的java驱动包放到java程序的classpath中。

       MongoDB的 java 驱动包下载地址是:
       https://github.com/MongoDB/mongo-java-driver/releases

       集算器 SPL 支持的语言包括:

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西班牙文洪都拉斯
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值