createIndexes

在本页面

Definition

createIndexes命令采用以下形式:

db.runCommand(
  {
    createIndexes: <collection>,
    indexes: [
        {
            key: {
                <key-value_pair>,
                <key-value_pair>,
                ...
            },
            name: <index_name>,
            <option1>,
            <option2>,
            ...
        },
        { ... },
        { ... }
    ],
    writeConcern: { <write concern> }
  }
)

createIndexes命令具有以下字段:

Field Type Description
createIndexes string 要为其创建索引的集合。
indexes array 指定要创建的索引。数组中的每个文档都指定一个单独的索引。
writeConcern document 可选的。表示write concern的文档。省略使用默认的写关注。


3.4 版中的新功能。

indexes数组中的每个文档都可以包含以下字段:

在版本 3.0 中更改:dropDups选项不再可用。

Field Type Description
key document 指定索引的字段。对于每个字段,指定一个键值对,其中键是要索引的字段的名称,值是索引方向或index type。如果指定方向,请指定1代表升序或-1代表降序。
name string 唯一标识索引的名称。
background boolean 可选的。在后台构建索引,因此该操作不会*阻止其他数据库活动。指定true以在后台构建。默认值为false
unique boolean 可选的。创建唯一索引,以便在索引键值与索引中现有值匹配的集合中,该集合将不接受文档的插入或更新。


指定true以创建唯一索引。默认值为false
对于hashed个索引,此选项“不可用”。
| partialFilterExpression |文档|可选。如果指定,则索引仅引用与过滤器表达式匹配的文档。有关更多信息,请参见Partial Indexes
过滤器表达式可以包括:
等式表达式(即field: value或使用$eq运算符),
$exists: true expression,
$gt$gte$lt$lte个表达式,
$type expressions,
$and仅限顶级运算符
您可以为所有 MongoDB index types指定partialFilterExpression选项。
版本 3.2 中的新功能。
| sparse |布尔值|可选。如果为true,则索引仅引用具有指定字段的文档。这些索引使用较少的空间,但是在某些情况下(特别是排序)表现不同。默认值为false。有关更多信息,请参见Sparse Indexes
在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,MongoDB 提供了创建partial indexes的选项。部分索引提供了稀疏索引功能的超集。如果您使用的是 MongoDB 3.2 或更高版本,则partial indexes应该比稀疏索引更可取。
在 2.6 版中更改:默认情况下,2dsphere索引稀疏,并且忽略此选项。对于包含2dsphere索引键以及其他类型的键的复合索引,只有2dsphere索引字段确定该索引是否引用文档。
2dgeoHaystacktext索引的行为类似于2dsphere索引。
| expireAfterSeconds |整数|可选。将值(以秒为单位)指定为TTL,以控制 MongoDB 在此集合中保留文档的时间。有关此功能的更多信息,请参见通过设置 TTL 使集合中的数据过期。这仅适用于TTL个索引。
| storageEngine |文档|可选。允许用户在创建索引时基于每个索引配置存储引擎。
storageEngine选项应采用以下形式:
storageEngine: { <storage-engine-name>: <options> }
在复制期间验证在创建索引时指定的存储引擎配置选项,并将其记录到oplog上,以支持具有使用不同存储引擎的成员的副本集。
3.0 版中的新功能。
| weights |文档|可选。对于text索引,该文档包含字段和权重对。权重是一个介于 1 到 99,999 之间的整数,表示该得分相对于其他索引字段的得分的重要性。您可以为某些或所有索引字段指定权重。请参阅用权重控制搜索结果以调整分数。缺省值为1
| default_language | string |可选。对于text索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则。有关可用语言,请参见Literals 搜寻语言,有关更多信息和示例,请参见指定文本索引的语言。缺省值为english
| language_override | string |可选。对于text索引,是集合文档中包含文档替代语言的字段名称。默认值为language。请参见使用任何字段来指定文档的语言
| textIndexVersion |整数|可选。 text索引版本号。用户可以使用此选项覆盖默认版本号。
有关可用版本,请参见Versions
2.6 版中的新功能。
| 2dsphereIndexVersion |整数|可选。 2dsphere索引版本号。用户可以使用此选项覆盖默认版本号。
有关可用版本,请参见Versions
2.6 版中的新功能。
| bits |整数|可选。对于2d索引,是所存储的geohash位置数据值的精度数。
bits值的范围是 1 到 32(含)。缺省值为26
| min |数字|可选。对于2d索引,经度和纬度值的下界边界。缺省值为-180.0
| max |数字|可选。对于2d索引,是经度和纬度值的包含上边界。缺省值为180.0
| bucketSize | number |对于geoHaystack索引,请指定将位置值分组的单位数;即在同一存储桶中将彼此位于指定数量单位内的位置值分组。
该值必须大于 0.
| collation |文档|可选。指定索引的collation
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
如果您在集合级别指定了排序规则,则:
如果在创建索引时未指定排序规则,则 MongoDB 将使用集合的默认排序规则创建索引。
如果在创建索引时确实指定了排序规则,则 MongoDB 会使用指定的排序规则创建索引。
排序规则选项具有以下语法:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
指定排序规则时,locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document
3.4 版中的新功能。

mongo shell 提供了方法db.collection.createIndex()db.collection.createIndexes()作为createIndexes命令的包装器。

Considerations

在版本 3.2 中进行了更改:MongoDB 禁止创建version 0索引。要升级现有的版本 0 索引,请参阅版本 0 索引

Index Names

包括namespace在内的索引名称不能超过索引名称长度的限制。

副本集和分片群集

为了最大程度地减少对副本集和分片群集构建索引的影响,请按照在副本集上构建索引所述使用滚动索引构建过程。

排序规则和索引类型

以下索引仅支持简单的二进制比较,不支持collation

Tip

要在具有非简单排序规则的集合上创建text2dgeoHaystack索引,必须在创建索引时明确指定{collation: {locale: "simple"} }

Behavior

Concurrency

填充的集合上的前景索引操作将阻止数据库上的所有其他操作。

多索引构建

在 3.0.0 版中更改。

如果为createIndexes命令指定了多个索引,则该操作仅扫描一次集合,并且如果要在前台构建至少一个索引,则该操作将在前台构建所有指定的索引。

内存使用限制

在版本 3.4 中进行了更改:您可以使用数据库命令createIndexes在集合上构建一个或多个索引。 createIndexes操作的默认内存使用限制为 500 MB。您可以通过设置maxIndexBuildMemoryUsageMegabytes服务器参数来覆盖此限制。

createIndexes结合使用内存和磁盘上的临时文件来完成索引构建。达到内存限制后,createIndexes--dbpath目录中名为_tmp的子目录中的临时磁盘文件用于其他暂存空间。设置的内存限制越高,索引构建就可以完成得越快,但是请注意不要相对于可用 RAM 将此限制设置得太高,否则系统可能会耗尽可用内存。

Index Options

除了collation option之外,如果您创建具有一组选项的索引,然后使用相同的索引字段但使用不同的选项发出createIndexes,则 MongoDB 不会更改选项或重建索引。要更改这些索引选项,请在使用新选项运行新的createIndexes之前,先用db.collection.dropIndex()删除现有索引。

Collation Option

3.4 版的新功能。

与其他索引选项不同,您可以在具有不同排序规则的同一键上创建多个索引。要创建具有相同键模式但归类不同的索引,必须提供唯一的索引名称。

如果您在集合级别指定了排序规则,则:

Tip

通过指定12的排序规则strength,可以创建不区分大小写的索引。排序规则strength1的索引不区分字母和大小写。

要将索引用于字符串比较,操作还必须指定相同的排序规则。也就是说,如果排序规则的索引指定了不同的排序规则,则该索引不能支持对索引字段执行字符串比较的操作。

例如,集合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" } )

Example

以下命令在products数据库的inventory集合上构建两个索引:

db.getSiblingDB("products").runCommand(
  {
    createIndexes: "inventory",
    indexes: [
        {
            key: {
                item: 1,
                manufacturer: 1,
                model: 1
            },
            name: "item_manufacturer_model",
            unique: true
        },
        {
            key: {
                item: 1,
                supplier: 1,
                model: 1
            },
            name: "item_supplier_model",
            unique: true
        }
    ],
    writeConcern: { w: "majority" }
  }
)

索引成功完成构建后,MongoDB 将返回一个状态为"ok" : 1的结果文档。

Output

createIndexes命令返回一个指示操作成功的文档。根据结果,文档包含以下一些但并非全部字段:

首页