1.前言
在Mongodb集合中插入文档记录时,如果没有指定_id字段的值,则会默认生成一个ObjectId类型的值并赋值给_id字段,同时也会默认在_id字段上创建一个具有唯一的主键索引。
2.语法
db.collection.createIndex(keys,options)
- keys指定需要创建索引的字段,可以是一个或多个字段,其值的样式为{"字段名":"索引类型"}。索引类型可以为1或者-1,当为1时表示创建一个升序排列的索引(索引叶子节点上链表的排序方向),当为-1时表示创建一个降序排序的索引。索引的类型还可以为text(文本索引)、geospatial(地理位置索引)、hashed(Hash索引)等。
- options为可选字段,如通过name指定索引的名称(替代默认的命令规则)、unique指定索引的唯一性(创建唯一索引)、expireAfterSeconds指定索引的TTL的值(控制一条文当记录在集合中的保存时间,这对不需要长时间保留的日志等数据库非常有用)。
2.1.单字段索引
> db.student.find() { "_id" : 1, "name" : "z1", "age" : 10 } { "_id" : 2, "name" : "l1", "age" : 11 }
这时在name字段上创建一个索引
> db.student.createIndex({'name':1}) //使用createIndex进行创建 { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } >
查看索引创建的信息
> db.student.getIndexes() //查看这个集合中索引信息 [ { "v" : 2, // 索引的版本号 "key" : { "_id" : 1 // 表示索引在_id字段上 }, "name" : "_id_" // 表示这个索引名是_id_ }, { "v" : 2, "key" : { "name" : 1 // 表示在name字段上有索引 }, "name" : "name_1" // 表示索引名是name_1 } ]
2.2.多字段的复合索引
> db.student.createIndex({"name":1,"age":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 } >
这里可以用db.student.getIndexes()查看索引情况
{ "v" : 2, "key" : { "name" : 1, //这里可以看到有两个字段组成了一个复合索引 "age" : 1 }, "name" : "name_1_age_1" //该索引名为name_1_age_1 } ]
3.索引选择
上面知道了怎样创建单字段索引和复合索引,其中单字段索引最简单,这里就不说了,这里主要说说复合索引。
对于复合索引一般按照:ESR原则进行组合:
精确(Equal) 匹配的字段放最前面
排序(Sort) 条件放中间
范围(Range) 匹配的字段放在最后面
比如如下:
db.members.find({gende:"F",age:{$gte:18}}).sort("join_date":1) //比如要进行一个这样的查询 //这里可以创建一个如下这样的复合索引进行查询 {gender:1,join_data:1,age:1}
4.删除索引
语法:
db.collection.dropIndex(index) //index参数表示字符串类型的索引名称或创建索引时指定文档记录 //删除一个索引 db.collection.dropIndex("索引名") //删除多个索引 db.collection.dropIndexes(["索引名称1","索引名称2","索引名称3"...]) 注意:不能删除主键_id中的索引