协助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 的代码如下:
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 支持的语言包括:
文章标题:协助MongoDB计算之本地化排序
当前地址:http://cdiso.cn/article/ishhgi.html