不区分大小写的索引

在本页面

3.4 版的新功能。

不区分大小写的索引支持在不考虑大小写的情况下执行字符串比较的查询。

通过将collation参数指定为选项,可以使用db.collection.createIndex()创建不区分大小写的索引。例如:

db.collection.createIndex( { "key" : 1 },
                           { collation: {
                               locale : <locale>,
                               strength : <strength>
                             }
                           } )

要为区分大小写的索引指定排序规则,包括:

  • locale:指定语言规则。有关可用语言环境的列表,请参见Collation Locales

  • strength:确定比较规则。值12表示不区分大小写的排序规则。

有关其他排序规则字段,请参见Collation

Behavior

使用不区分大小写的索引不会影响查询的结果,但是可以提高性能。有关索引的成本和收益的详细讨论,请参见Indexes

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

Examples

创建不区分大小写的索引

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

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

db.createCollection("fruit")

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

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

db.fruit.insert( [ { 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.insert( [ { 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值的排序规则。它不使用集合的默认排序规则或索引。