开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。
传统数据库中collation的使用在MYSQL 和 PG 已经总结了,在MONGODB 中是否有collation的问题,以及Mongodb中的一些数据类型的问题的说一说。
在MONGODB 中也存在collation的问题,在MONGODB 的string 文本类型的都存在这个问题。针对于MONGODB的 collection ,view, index等都涉及特定操作针对collation的操作。因为如果我们不进行这个操作,MONGODB 对于这些数据的操作将采用普通的二进制字符串来对比。
那么我们从建立一个collection 说起,怎么建立一个具有collation 的collection。
db.createCollection("en_test",{collation:{ "locale": "en_US", strength : 3,caseFirst: "upper"}})
上面的列子中,我们建立了一个 en_test 的collection, 我们的collation选择的是 en_US ,排序规则,其中比较的方式的深度,下探到第三个等级,其中包含字母的大小写比较,字母变体,变音符号等,最后是指定在比对中对于字母大小写的判断,谁先谁后。
db.en_test.insert({"text":"aaAABBbb"});
db.en_test.insert({"text":"ccAABBbb"});
db.en_test.insert({"text":"CCAABBbb"});
db.en_test.insert({"text":"aaTTBBbb"});
db.en_test.insert({"text":"SSAABBbb"});
db.en_test.insert({"text":"PPAABBbb"});
db.en_test.insert({"text":"aaAANNbb"});
db.en_test.insert({"text":"AAAANNbb"});
db.en_test.insert({"text":"AAAABBbb"});
下面我们先感性,在理性,的方式先输入一串数据,然后我们进行比对
我们可以看到,在使用了collation的collection中我们的字符进行了指定方式的排序方面的大小比对。
那么如果我们如果针对这个字符,不进行相关的处理,结果会是怎么样?下图给出了结果,在没有任何collation设置的情况下,MONGODB 对于数据的处理,并未根据字符的特性来进行大小写的排序操作。
到了这里,我们继续我们上面的命令的问题.
在MONGODB 中可以进行调整的collation的参数在创建collation的时候就有以下相关的参数
{ |
locale: <string>, |
caseLevel: <boolean>, |
caseFirst: <string>, |
strength: <int>, |
numericOrdering: <boolean>, |
alternate: <string>, |
maxVariable: <string>, |
backwards: <boolean> |
} |
1 locale :locale 在collation 的使用中是一个核心的参数,这个参数是针对整个collection 进行的设定,这里有的collation有小的选择项,所以撰写的方法需要根据你的collation的情况来定。 参见下图如 Chinese 中zh 包含了4种小的选项。
撰写的方式为 { "locale" : "zh@collation=unihan" }
2 strength
这个参数是整体mongodb collation不可缺失的部分,其中分为5个部分,一般我们至少选择3作为一个基础,因为 1 和 2 两个部分不能满足字符的大小写和比较的基本场景。一般的情况下,我们选择 3 作为基本的选择,这也是我们默认应该选择的级别,选择这个级别下,大小写和字符的重音等的比较都可以进行比较。如果是日文的一些比对,则可以选择 4 作为一个选项。
3 caselevel 这个参数在选择了 strength 为 3后,可以不在出现
4 caseFirst 这个参数有3个值进行选择,upper ,lower 这个参数是针对 upper 和 lower ,如果选择 upper 则大写字母则在比较中 UPPER 会比 LOWER 在排序上靠前,如果选择lower 则小写比大写在排序中靠前。
5 numericOrdering 这个是决定文字符合的数值到底是以数值的方式比较还是以数值的方式比较,如选择 true 则说明按照数字的方式比较, 如果是false 则是按照 false 来比较。
另外还有其他的一些选择,这里由于没有一些如,丹麦,瑞典,等国的知识,以及语言和重音符号的知识,所以,这些选项暂时无法得知相关的使用用途。
下面我们举一个例子,在一个字符串中,我们需要使用英文的方式对大小写进行比较,大写大于小写,同时我们需要对数字使用数字的方式进行数值的比对
db.createCollection("text_compare",{collation:{ "locale": "en_US", "strength" : 3,"caseFirst": "upper", "numericOrdering": true }})
db.text_compare.find().sort({text:1})
在我们插入数据后进行了排序后,我们发现整体的排序和我们预想的是一样的数字虽然是以字符的方式进行输入的,但排序中是以数值的方式进行排序的。
说完这些,实际上我们还有一个问题就是索引的问题,MONGODB 的索引,上面的操作都是输入了数据而已,但是如果是数据量大的情况下,我们需要索引的加持来处理问题,那么如何建立一个带有collation属性的索引的问题就摆到台面上来了。
db.text_compare.createIndex({text: 1},{collation:{locale: 'en_US',strength: 3}})
截止目前我们简单的说了说MONGODB 中的COLLATION 的COLLECTION的建立和索引以及一些特性的问题,希望能让大家在使用MONGODB 的同时,对于一些更多的细节有更深的了解。