索引是为了高效查询所设置,MongoDB 也不例外,它支持不同形式的索引,创建索引使用 db.collection.createIndex()
命令。
命令详解
命令语法
命令的格式如下:
> db.{collection_name}.createIndex(keys, options)
其中,collection_name
是所要创建索引的集合名称;keys
指定针对集合的要建索引的 field 项,options
里设置索引相关的配置项,如唯一属性及过期时间等。
参数 | 类型 | 描述 |
---|---|---|
keys | 文档 | (必选项),指定集合中要建立索引的字段和排序形式。 |
options | 文档 | (可选项),指定索引的配置相关信息。 |
可选项 options 参数有如下可配置项:
字段 | 类型 | 描述 | 备注 |
---|---|---|---|
background | 布尔 | (可选项),表示是否通过后台方式建立索引,默认为 false,即表示建索引过程会阻塞其它数据库操作;若为 true,则以后台方式创建索引。 | |
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 天之外的范围,会自动过期。