文档菜单
文档首页
/
MongoDB 手册
/

校对

本页内容

  • 校对文档
  • 支持校对的操作
  • 行为
  • 限制

校对允许用户指定字符串比较的语言特定规则,例如大小写和重音符号的规则。

您可以为集合或视图、索引或支持校对的特定操作指定校对。

要在 MongoDB Atlas UI 中查询文档时指定校对,请参阅指定校对.

校对文档包含以下字段

{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定校对时,locale字段是必需的;所有其他校对字段都是可选的。有关字段的描述,请参阅校对文档。

默认校对参数值取决于您指定的区域设置。有关默认校对参数及其关联的区域设置的完整列表,请参阅校对默认参数.

字段
类型
描述
locale
字符串

ICU区域设置。有关受支持的区域设置的列表,请参阅支持的语言和区域设置

要指定简单的二进制比较,指定locale值为"simple"

strength
整数

可选。要执行的比较级别。对应于ICU比较级别。可能的值是

描述
1
主要比较级别。校对仅比较基字符,忽略其他差异,如变音符号和大小写。
2
次要比较级别。校对比较到次要差异,如变音符号。也就是说,校对比较基字符(主要差异)和变音符号(次要差异)。基字符之间的差异优先于次要差异。
3

三级比较级别。校对比较到三级差异,如大小写和字母变体。也就是说,校对比较基字符(主要差异)、变音符号(次要差异)和大小写及变体(三级差异)。基字符之间的差异优先于次要差异,次要差异优先于三级差异。

这是默认级别。

4
四级水平。仅限特定用例使用,考虑在1-3级水平忽略标点符号时的情况,或用于处理日文文本。
5
相同级别。仅限特定用例的平局决定。

详细信息请见ICU Collation: Comparison Levels

caseLevel
布尔型

可选。标志,用于确定是否在强度级别12包含大小写比较。

如果true,则包含大小写比较

  • 当与strength:1一起使用时,比较基础字符和大小写。

  • 当与strength:2一起使用时,比较基础字符、变音符号(以及可能的二级差异)和大小写。

如果false,则不在级别12包含大小写比较。默认为false

更多信息请见ICU Collation: Case Level

caseFirst
字符串

可选。一个字段,用于确定在三级水平比较期间大小写差异的排序顺序。

可能的值有

描述
"upper"
大写字母排序在小写字母之前。
"lower"
小写字母排序在大写字母之前。
"off"
默认值。类似于 "lower",略有不同。见 https://unicode-org.github.io/icu/userguide/strings/properties.html#customization 了解差异的详细信息。
numericOrdering
布尔型

可选。标志,用于确定是否将数字字符串作为数字或作为字符串进行比较。

如果 true,则按数字比较。例如,"10" 大于 "2"

如果 false,则按字符串比较。例如,"10" 小于 "2"

默认值为 false

numericOrdering 限制。

alternate
字符串

可选。字段,用于确定比较时是否应将空白符和标点符号视为比较的基础字符。

可能的值有

描述
"non-ignorable"
空白符和标点符号被视为基础字符。
"shifted"
空白符和标点符号不被视为基础字符,仅在大于3的强度级别上区分。

ICU Collation: Comparison Levels 了解更多信息。

默认值为 "non-ignorable"

maxVariable
字符串

可选。字段,用于确定在 alternate: "shifted" 时,哪些字符被视为可忽略的。如果 alternate: "non-ignorable",则无效果。

可能的值有

描述
"punct"
空白符和标点符号都是可忽略的,且不被视为基础字符。
"space"
空白符是可忽略的,且不被视为基础字符。
backwards
布尔型

可选。标志用于确定带有重音符号的字符串是否从字符串的末尾开始排序,例如某些法语字典排序。

如果 true,则从后向前比较。

如果 false,则从前向后比较。

默认值为 false

规范化
布尔型

可选。标志用于确定是否检查文本是否需要规范化以及是否执行规范化。通常,大多数文本不需要这种规范化处理。

如果 true,则检查是否完全规范化并执行规范化以比较文本。

如果 false,则不进行检查。

默认值为 false

有关详细信息,请参阅 https://unicode-org.github.io/icu/userguide/collation/concepts.html#normalization

您可以指定以下操作的排序

注意

您不能为一个操作指定多个排序。例如,您不能为每个字段指定不同的排序,或者在进行带有排序的查找时,您不能使用一个排序用于查找,另一个用于排序。

[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在数值字段scoreprice以及字符串字段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”,无论您为强度参数设置的值如何。

以下索引仅支持简单二进制比较,不支持排序:

提示

要在具有非简单排序的集合上创建text2d索引,必须在创建索引时显式指定{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.22.10 按字典顺序排序。

返回

参考

© . All rights reserved.