校对
校对允许用户指定字符串比较的语言特定规则,例如大小写和重音符号的规则。
您可以为集合或视图、索引或支持校对的特定操作指定校对。
要在 MongoDB Atlas UI 中查询文档时指定校对,请参阅指定校对.
校对文档
校对文档包含以下字段
{ locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> }
指定校对时,locale
字段是必需的;所有其他校对字段都是可选的。有关字段的描述,请参阅校对文档。
默认校对参数值取决于您指定的区域设置。有关默认校对参数及其关联的区域设置的完整列表,请参阅校对默认参数.
字段 | 类型 | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
locale | 字符串 | ICU区域设置。有关受支持的区域设置的列表,请参阅支持的语言和区域设置。 要指定简单的二进制比较,指定 | ||||||||||||
strength | 整数 | 可选。要执行的比较级别。对应于ICU比较级别。可能的值是
| ||||||||||||
caseLevel | 布尔型 | 可选。标志,用于确定是否在 如果
如果 更多信息请见ICU Collation: Case Level。 | ||||||||||||
caseFirst | 字符串 | 可选。一个字段,用于确定在三级水平比较期间大小写差异的排序顺序。 可能的值有
| ||||||||||||
numericOrdering | 布尔型 | 可选。标志,用于确定是否将数字字符串作为数字或作为字符串进行比较。 如果 如果 默认值为 | ||||||||||||
alternate | 字符串 | 可选。字段,用于确定比较时是否应将空白符和标点符号视为比较的基础字符。 可能的值有
见 ICU Collation: Comparison Levels 了解更多信息。 默认值为 | ||||||||||||
maxVariable | 字符串 | 可选。字段,用于确定在 可能的值有
| ||||||||||||
backwards | 布尔型 | 可选。标志用于确定带有重音符号的字符串是否从字符串的末尾开始排序,例如某些法语字典排序。 如果 如果 默认值为 | ||||||||||||
规范化 | 布尔型 | 可选。标志用于确定是否检查文本是否需要规范化以及是否执行规范化。通常,大多数文本不需要这种规范化处理。 如果 如果 默认值为 有关详细信息,请参阅 https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization。 |
支持排序的操作
您可以指定以下操作的排序
注意
您不能为一个操作指定多个排序。例如,您不能为每个字段指定不同的排序,或者在进行带有排序的查找时,您不能使用一个排序用于查找,另一个用于排序。
命令 | mongosh 方法 |
---|---|
cursor.collation() 用于指定 db.collection.find() 的排序 | |
在 db.collection.bulkWrite() .中执行单个更新、替换和删除操作。 |
[1] | (1, 2) 某些索引类型不支持排序规则。有关详细信息,请参阅排序规则和不支持的索引类型。 |
行为
本地变体
某些排序规则的本地化有变体,这些变体采用特定的语言特定规则。要指定本地化变体,请使用以下语法
{ "locale" : "<locale code>@collation=<variant>" }
例如,要使用中文排序规则的unihan
变体
{ "locale" : "zh@collation=unihan" }
有关所有排序规则本地化和其变体的完整列表,请参阅排序规则本地化。
排序和视图
您可以在创建视图时指定默认的排序。如果没有指定排序,视图的默认排序为“简单”的二进制比较排序器。也就是说,视图不会继承集合的默认排序。
视图上的字符串比较使用视图的默认排序。尝试更改或覆盖视图默认排序的操作将失败并产生错误。
如果从一个视图创建另一个视图,您不能指定与源视图排序不同的排序。
如果执行涉及多个视图的聚合操作,例如使用
$lookup
或$graphLookup
,则视图必须具有相同的排序。
排序和索引使用
要使用索引进行字符串比较,操作也必须指定相同的排序。也就是说,具有排序的索引不能支持在索引字段上执行字符串比较的操作,如果操作指定了不同的排序。
警告
由于配置了排序的索引使用ICU排序键来实现排序顺序,因此具有排序意识的索引键可能比未配置排序的索引键要大。
例如,集合myColl
在具有排序区域设置"fr"
的字符串字段category
上有一个索引。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
以下查询操作,指定与索引相同的排序方式,可以使用索引
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
然而,以下查询操作默认使用“简单”二进制排序器,无法使用索引
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"
二进制排序器在索引字段category
上进行字符串比较,可以使用索引来满足查询中的score: 5
部分
db.myColl.find( { score: 5, category: "cafe" } )
重要
对文档键的匹配,包括嵌套文档键,使用简单的二进制比较。这意味着对于像“foo.bár”这样的键的查询将不会匹配键“foo.bar”,无论您为强度参数设置的值如何。
排序和不受支持的索引类型
以下索引仅支持简单二进制比较,不支持排序:
提示
要在具有非简单排序的集合上创建text
或2d
索引,必须在创建索引时显式指定{collation: {locale: "simple"} }
。
限制
数字排序
当将 numericOrdering
设置为 true
时,以下限制适用
比较中只考虑连续的非负整数子字符串。
numericOrdering
不支持+
-
小数分隔符,如小数点和逗号
指数
只有属于数字或十进制数字(Nd)类别的 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" } ] )
以下 find
查询使用包含 numericOrdering
参数的排序文档
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' } ]
numericOrdering: true
按升序排序字符串值,就像它们是数字值一样。两个负值
-2.1
和-10
没有按预期排序,因为它们有不受支持的-
字符。由于
numericOrdering
参数不支持小数值,所以2.2
排序在2.10
之前。因此,
2.2
和2.10
按字典顺序排序。