集算器协助MongoDB计算之本地化排序
对于本地化语言(例如:中文),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" : "男"}…直接用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" : "男" }…用esProc协助MongoDB的脚本如下:
A1:连接MongoDB,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。如果需要其他参数的话可以按照mongo://ip:port/db?arg=value&…格式继续写参数。
A2:使用find函数从MongoDB中取数,形成游标。集合是person,过滤条件是空,指定键是name和gender。可以看出find函数和mongdb的find函数类似。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。
A3:因为数据量不大,所以这里fetch出游标的所有记录。A4:使用sort按照name升序排序。排序所使用的语言是中文。集算器支持的其他本地化语言,见后。运行的结果是:需要说明的是:esProc并不包含MongoDB的java驱动包。用esProc来访问MongoDB,必须提前将MongoDB的java驱动包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到commonjdbc中。esProc协助MongoDB计算的脚本很容易集成到java中,只要增加一行A5,写成result A4即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问MongoDB也必须将mongdb的java驱动包放到java程序的classpath中。MongoDB的java驱动包下载地址是: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 西班牙文洪都拉斯
页:
[1]