五、索引
1、创建索引
db.userInfo.ensureIndex({username: 1});
在MongoDB中,我们同样可以创建复合索引,如下:
db.userInfo.ensureIndex({username: 1, age: -1});
该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,但是只是基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。如:
db.test.find({"age": 30, "username": "stephen"})
对于上面示例中的查询条件,MongoDB在检索之前将会动态的调整查询条件文档的顺序,以使该查询可以用到刚刚创建的复合索引。
2、创建唯一索引
在缺省情况下创建的索引均不是唯一索引。下面的示例将创建唯一索引,如:
db.test.ensureIndex({"userid":1},{"unique":true})
如果再次插入userid重复的文档时,MongoDB将报错,以提示插入重复键,如:
db.test.insert({"userid":5})
db.test.insert({"userid":5})
E11000 duplicate key error index: test.test.$userid_1 dup key: { : 5.0 }
如果插入的文档中不包含userid键,那么该文档中该键的值为null,如果多次插入类似的文档,MongoDB将会报出同样的错误,如:
db.test.insert({"userid1":5})
db.test.insert({"userid1":5})
E11000 duplicate key error index: test.test.$userid_1 dup key: { : null }
如果在创建唯一索引时已经存在了重复项,我们可以通过下面的命令帮助我们在创建唯一索引时消除重复文档,仅保留发现的第一个文档,如:
--先删除刚刚创建的唯一索引。
db.test.dropIndex({"userid":1})
--插入测试数据,以保证集合中有重复键存在。
db.test.remove()
db.test.insert({"userid":5})
db.test.insert({"userid":5})
--创建唯一索引,并消除重复数据。
db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
--查询结果确认,重复的键确实在创建索引时已经被删除。
db.test.find()
{ "_id" : ObjectId("4fe823c180144abd15acd52e"), "userid" : 5 }
我们同样可以创建复合唯一索引,即保证复合键值唯一即可。如:
db.test.ensureIndex({"userid":1,"age":1},{"unique":true})
3、查询当前聚集集合所有索引
db.userInfo.getIndexes();
4、查看总索引记录大小
db.userInfo.totalIndexSize();
5、读取当前集合的所有index信息
db.users.reIndex();
6、删除指定索引
db.users.dropIndex("username":1);
7、删除所有索引索引
db.users.dropIndexes();