对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

不分大小写的索引

不区分大小写的索引支持执行字符串比较而不考虑大小写的查询。不区分大小写是由排序规则决定的。

重要

不区分大小写的索引不会提高 $regex 查询的性能,因为 $regex操作符不支持排序规则,因此无法利用此类索引。

您可以指定 collation 选项,以使用 db.collection.createIndex() 创建不区分大小写的索引:

db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } })

要为不区分大小写的索引指定排序规则,请在 collation 对象中包含以下字段:

字段
说明

locale

指定语言规则。有关可用的区域设置列表,请参阅支持的语言和区域设置。

strength

确定比较规则。strength 值为 1 或 2 表示不区分大小写的排序规则。

有关其他排序规则字段的信息,请参阅排序规则。

要使用指定排序规则的索引,查询和排序操作必须指定与该索引相同的排序规则。如果集合定义了排序规则,则所有查询和索引都会继承该排序规则,除非它们显式指定其他排序规则。

要在没有默认排序规则的集合上使用不区分大小写的索引,请创建一个具有排序规则的索引,并将 strength 参数设置为 1 或 2(有关 strength 参数的详细说明,请参阅排序规则)。您必须在查询级别指定相同的排序规则,才能使用索引级别排序规则。

以下示例创建一个没有默认排序规则的集合,然后在 type 字段上添加一个具有不区分大小写的排序规则的索引。

db.createCollection("fruit") db.fruit.createIndex( { type: 1 }, { collation: { locale: 'en', strength: 2 } })

要使用索引,查询必须指定相同的排序规则。

db.fruit.insertMany( [ { type: "apple" }, { type: "Apple" }, { type: "APPLE" }] ) db.fruit.find( { type: "apple" } ) // does not use index, finds one result db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 2 } )// uses the index, finds three results db.fruit.find( { type: "apple" } ).collation( { locale: 'en', strength: 1 } )// does not use the index, finds three results

使用默认排序规则创建集合时,除非指定了其他排序规则,否则,创建的所有索引随后都会继承该排序规则。未指定其他排序规则的所有查询也会继承默认排序规则。

以下示例将使用默认排序规则创建一个名为 names 的集合,然后对 first_name 字段创建索引。

db.createCollection("names", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { first_name: 1 } ) // inherits the default collation

插入一个小的名字集合:

db.names.insertMany( [ { first_name: "Betsy" }, { first_name: "BETSY"}, { first_name: "betsy"}] )

对此集合的查询默认使用指定的排序规则,如果可能的话,也使用索引。

db.names.find( { first_name: "betsy" } )// inherits the default collation: { collation: { locale: 'en_US', strength: 2 } }// finds three results

上述操作使用集合的默认排序规则并查找所有三个文档。它使用first_name字段上的索引以提高性能。

仍可通过在查询中指定不同的排序规则来对此集合执行区分大小写的搜索:

db.names.find( { first_name: "betsy" } ).collation( { locale: 'en_US' } )// does not use the collection's default collation, finds one result

上述操作仅查找一个文档,因为它使用未指定strength值的排序规则。它不会使用集合的默认排序规则或索引。