索引是为了高效查询所设置,MongoDB 也不例外,它支持不同形式的索引,创建索引使用 db.collection.createIndex() 命令。
命令详解
命令语法
命令的格式如下:
> db.{collection_name}.createIndex(keys, options)
其中,collection_name 是所要创建索引的集合名称;keys 指定针对集合的要建索引的 field 项,options 里设置索引相关的配置项,如唯一属性及过期时间等。
参数
类型
描述
keys
文档
(必选项),指定集合中要建立索引的字段和排序形式。
options
文档
(可选项),指定索引的配置相关信息。
可选项 options 参数有如下可配置项:
字段
类型
描述
备注
background
布尔
(可选项),表示是否通过后台方式建立索引,默认为 false,即表示建索引过程会阻塞其它数据库操作;若为 true,则以后台方式创建索引。
从 4.2 版本开始废弃,会使用优化的建索引操作,尽量不会阻塞其它操作。
unique
布尔
(可选项),表示建立的索引是否是唯一索引,默认为 false。
该选项针对 hash 结构的索引不起作用。
name
字符串
(可选项),指定索引的名称,如果不设置,MongoDB 会将所指定的索引和排序方式联结拼在一起生成一个索引名。
expireAfterSeconds
数值
(可选项),指定一个以秒为单位的数值,完成 TTL(生存时间)设定,即经过设置的时间后,文档会失效。
选定的字段必须是 MongoDB 的时间类型才能生效。
命令范例
首先进入指定数据库的上下文:
> use test
switched to db test
假设给集合 mycol 的相关字段添加索引,字段有 item_id、dt、data、status。
给 status 字段创建普通的索引:
> db.mycol.createIndex({ "status" : 1 }, { "name" : "idx_type" })
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1603701396, 2),
"signature" : {
"hash" : BinData(0,"ogJcs3E3fdDBlh6Q1a2Gp3kmLKw="),
"keyId" : NumberLong("6886656746882859010")
}
},
"operationTime" : Timestamp(1603701396, 2)
}
为 data 字段的内嵌字段 ctr,创建内嵌字段索引:
> db.mycol.createIndex({ "data.ctr" : 1 }, { "name" : "idx_data_ctr" })
为 item_id 和 dt 两个字段,创建组合索引:
> db.mycol.createIndex({ "item_id" : 1, "dt" : -1 }, { "name" : "idx_item_dt" })
针对 dt 字段,设置 ttl 索引:
> db.mycol.createIndex({ "dt" : -1 }, { "name" : "idx_dt", "expireAfterSeconds" : 86400 })
其中 expireAfterSeconds 设置为 86400,表示记录的时间 dt 如果在 1 天之外的范围,会自动过期。