Collation特性(排序规则) 是mongoDB 3.4 版本新增的。 允许MongoDB的用户根据不同的语言定制排序规则。
1. 排序属性
排序规则有如下的字段属性
// 排序规则文档
{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
locale字段是强制性必选参数;所有其他排序规则字段都是可选的。
1.1 locale
国家地区语言设置, 要指定简单的二进制比较,将locale 值设定为"simple"
即可
具体local 及国家地区语言对照表如下
使用语法,@collation=<variant>
可选
{ "locale" : "<locale code>@collation=<variant>" }
// 示例:
{ "locale" : "zh@collation=unihan" }
1.2 strength
可选参数, 表示要执行的比较级别。有如下几种参数值
参数值 | 描述 |
---|---|
1 | 初级比较水平。 Collation 仅执行基本字符的比较,忽略其他差异,例如变音符号和大小写 |
2 | 二级比较。 Collation 执行直到次要差异的比较,例如变音符号。也就是说,排序规则执行基本字符(主要差异)和变音符号(次要差异)的比较。基本字符之间的差异优先于次要差异 |
3 | 三级比较。 Collation 执行直到三级差异的比较,例如大小写和字母变体。也就是说,排序规则执行基本字符(主要差异)、变音符号(次要差异)以及大小写和变体(三次差异)的比较。基本字符之间的差异优先于二级差异,二级差异优先于三级差异。 这是默认级别
|
4 | 第四级。仅限于在 1-3 级忽略标点符号或处理日语文本时考虑标点符号的特定用例 |
5 | 仅限于联络断路器的特定用例 |
1.3 caseLevel
可选参数,当strength 参数为1和2 时 该参数标识是否支持大小写比较
如果caseLevel =true,表示支持大小写比较
- strength =1: 排序规则比较基本字符和大小写
- strength =2: collation 比较基本字符、变音符号(以及可能的其他次要差异)和大小写
如果caseLevel =false , 表示不支持大小写比较
Flag that determines whether to include case comparison at strength level 1 or 2
1.4 caseFirst
可选参数 在三级比较时 确定大小写差异排序顺序的字段
参数值 | 含义 |
---|---|
"upper" | 大写在小写之前排序 |
"lower" | 小写在大写之前排序 |
"off" |
默认值 ,与“lower”相似但略有不同 |
1.5 numericOrdering
可选参数,确定是将数字字符串作为数字还是字符串进行比较的标志,默认值为fasle
如果 numericOrdering= true,表示将数字字符串作为数字比较,
例如,“10”大于“2”
反之,numericOrdering= false,则作为字符串进行比较。例如,“10”小于“2”
局限
在比较中只考虑连续的非负整数数字子串。 numericOrdering 不支持:+,-,小数分隔符,如小数点和小数逗号,指数
只有数字或十进制数字 类别中的 Unicode 代码点被视为数字
如果数字长度超过 254 个字符,超出的字符将被视为单独的数字
示例:
// 数据库中插入如下的字符串数字
db.c.insertMany(
[
{ "n" : "1" },
{ "n" : "2" },
{ "n" : "2.1" },
{ "n" : "-2.1" },
{ "n" : "2.2" },
{ "n" : "2.10" },
{ "n" : "2.20" },
{ "n" : "-10" },
{ "n" : "10" },
{ "n" : "20" },
{ "n" : "20.1" }
]
)
// 设置排序后
db.c.find(
{ }, { _id: 0 }
).sort(
{ n: 1 }
).collation( {
locale: 'en_US',
numericOrdering: true
} )
结果:
[
{ n: '-2.1' },
{ n: '-10' },
{ n: '1' },
{ n: '2' },
{ n: '2.1' },
{ n: '2.2' },
{ n: '2.10' },
{ n: '2.20' },
{ n: '10' },
{ n: '20' },
{ n: '20.1' }
]
1.6 alternate
可选参数。确定排序规则是否应将空格和标点符号视为基本字符以进行比较的字段。
参数值 | 含义 |
---|---|
"non-ignorable" | 空格和标点符号被视为基本字符,默认值
|
"shifted" | 空格和标点不被视为基本字符,仅在strength> 3 时才能区分 |
1.7 maxVariable
可选参数, 当 alternate参数是 "shifted"时,确定哪些字符被视为可忽略的字段
当alternate= "non-ignorable"时, 该参数不生效
参数值 | 含义 |
---|---|
"punct" | 空格和标点符号都是可忽略的,不被视为基本字符 |
"space" | 空格是可忽略的,不被视为基本字符 |
1.8 backwards
可选参数,确定带有变音符号的字符串是否从字符串后面排序的标志,例如某些法语字典排序。 如果为true,请从后到前进行比较。 如果为false,则从前到后进行比较。 默认值为false
1.8 normalization
可选参数。确定是否检查文本是否需要规范化并执行规范化的标志。通常,大多数文本不需要这种规范化处理。 如果为true,检查是否完全规范化并执行规范化以比较文本。 如果为false,则不检查。 默认值为fasle
1.9 参数值列表
Collation 参数中,locale 是必选参数,其他的都是可选参数,以下参数默认在所有语言环境中(locales)都是一致的:
- caseLevel : false
- strength : 3
- numericOrdering : false
- maxVariable : punct
下图是在不同locale 参数中,其他可选参数的默认值,供参考
注意 不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带有排序的查找,则不能使用一种排序规则进行查找而使用另一种排序规则进行排序
2. 支持排序规则的操作
支持排序规则的操作指指令如下图所示
使用示例
// 集合 myColl 在 `category` 字段上设置一个索引并设置了语言为'fr' 的排序规则
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
// 以下查询操作指定与索引相同的排序规则,可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
// 以下查询操作,默认情况下使用“simple”二进制排序方式,不能使用索引
db.myColl.find( { category: "cafe" } )
对于索引前缀键不是字符串、数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。
// 集合 myColl 对数字字段 score 和 price 以及字符串字段category具有复合索引;索引是使用排序规则语言环境“fr”创建的,用于字符串比较
db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )
//以下使用“simple”二进制排序规则进行字符串比较的操作可以使用索引:
db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
// 以下操作使用“simple”二进制排序规则对索引类别字段进行字符串比较,可以使用索引仅满足查询的 score: 5 部分
db.myColl.find( { score: 5, category: "cafe" } )
参考文档:https://www.mongodb.com/docs/manual/reference/collation/