不区分大小写的索引
不区分大小写的索引支持不区分大小写的字符串比较查询。不区分大小写来自校对.
重要
不区分大小写的索引通常不会提高 $regex
查询的性能。由于 $regex
实现不感知校对,因此无法有效地利用不区分大小写的索引。
命令语法
您可以通过指定 collation
选项使用 db.collection.createIndex()
创建一个不区分大小写的索引
db.collection.createIndex( { <field>: <sortOrder> }, { collation: { locale : <locale>, strength : < 1 | 2 > } } )
要指定一个不区分大小写的索引的校对,请将以下字段包含在 collation
对象中
字段 | 描述 |
---|---|
locale | 指定语言规则。有关可用语言和区域设置的列表,请参阅 支持的语言和区域设置。 |
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
值的排序规则。它没有使用集合的默认排序规则或索引。