On this page
createIndexes
在本页面
Definition
createIndexes
- 在集合上构建一个或多个索引。
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
索引字段确定该索引是否引用文档。
2d,geoHaystack和text索引的行为类似于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:
text indexes,
2d个索引,以及
geoHaystack indexes.
Tip
要在具有非简单排序规则的集合上创建text
,2d
或geoHaystack
索引,必须在创建索引时明确指定{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 版的新功能。
与其他索引选项不同,您可以在具有不同排序规则的同一键上创建多个索引。要创建具有相同键模式但归类不同的索引,必须提供唯一的索引名称。
如果您在集合级别指定了排序规则,则:
如果在创建索引时未指定排序规则,则 MongoDB 将使用集合的默认排序规则创建索引。
如果在创建索引时确实指定了排序规则,则 MongoDB 会使用指定的排序规则创建索引。
Tip
通过指定1
或2
的排序规则strength
,可以创建不区分大小写的索引。排序规则strength
为1
的索引不区分字母和大小写。
要将索引用于字符串比较,操作还必须指定相同的排序规则。也就是说,如果排序规则的索引指定了不同的排序规则,则该索引不能支持对索引字段执行字符串比较的操作。
例如,集合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
在数字字段score
和price
和字符串字段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命令返回一个指示操作成功的文档。根据结果,文档包含以下一些但并非全部字段:
createIndexes.
createdCollectionAutomatically
- 如果为
true
,则该集合不存在,并且是在创建索引的过程中创建的。
- 如果为
createIndexes.
numIndexesBefore
- 命令开始处的索引数。
createIndexes.
numIndexesAfter
- 命令末尾的索引数。
createIndexes.
ok
- 值
1
表示索引已就位。值0
表示错误。
- 值
createIndexes.
note
- 如果一个或多个现有索引已存在,则返回此
note
。这表明未创建或更改索引。
- 如果一个或多个现有索引已存在,则返回此
createIndexes.
errmsg
- 返回有关任何错误的信息。
createIndexes.
code
- 表示错误类型的错误代码。