45yt 发表于 2014-12-2 09:13:19

集算器协助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]
查看完整版本: 集算器协助MongoDB计算之本地化排序