一、创建索引

创建索引使用db.collectionName.ensureIndex(...)方法进行创建;

语法:

>db.COLLECTION_NAME.ensureIndex({KEY:1})

KEY 值为要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

ensureIndex() 也可以设置使用多个字段创建索引(在关系型数据库中称作复合索引)。

实例:

> db.yuyueCollection.ensureIndex({ "BR.registerdate" : 1, "BR.lastmodify" : 1},{'background':true})

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

参考实例一:创建普通索引

> db.users.ensureIndex({"name":1})

这样就在users这个集合上面的name字段上面创建了一个name_1的索引,{"name":1}说明建立的索引是升序的,如果{"name":-1}说明创建的索引是降序的。

参考实例二:创建普通复合索引

db.users.ensureIndex({"name":1,"age":1})

这样就在users这个集合上面的name和age字段上面创建了一个name_1_age_1的索引.

参考实例三:创建唯一索引

唯一索引可以确保集合里面的每一个文档指定的键都有唯一值。例如,如果想保证不同文档的name键拥有不同的值,创建一个唯一索引就可以了:

> db.dept.ensureIndex({"name":1},{"unique":true})

创建完唯一索引以后,如果想向dept集合中添加如下文档:

> db.dept.insert({ "_id" : 1, "name" : "ickes" })  
    > db.dept.insert({ "_id" : 2, "name" : "ickes" })

会发现只有第一个文档添加进去了,添加第二个时就会抛出异常,所以使用唯一索引来应对偶尔可能出现键重复的问题,而不是在运行时对重复键进行过滤。"_id"就是这中类型的索引,这个索引会在创建集合时自动创建。

参考实例四:创建复合唯一索引

创建复合唯一索引时,单个键的值可以相同,但是所有键的组合的值必须是唯一的。

> db.users.ensureIndex({"name":1,"age":1},{"unique":true})

参考实例五:创建唯一索引时去除重复  

在已有的集合上面创建唯一索引时,可能失败,因为集合中可能已经存在重复值了,如下所示:

> db.dept.find()   
    { "_id" : 1, "name" : "ickes" }  
    { "_id" : 2, "name" : "ickes" }  
    { "_id" : 3, "name" : "ickes1" }  
    { "_id" : 4, "name" : "eks" }  
    { "_id" : 5, "name" : "eks" }  
    
    --从上面的集合中看出name已经有大量重复值,创建唯一索引时抛出异常
    
     
    > db.dept.ensureIndex({"name":1},{"unique":true})  
    {  
            "createdCollectionAutomatically" : false,  
            "numIndexesBefore" : 1,  
            "ok" : 0,  
            "errmsg" : "E11000 duplicate key error index: test.dept.$name_1  dup key  
    : { : \"eks\" }",  
            "code" : 11000  
    }

通常需要对已有的数据进行处理(可以使用聚合框架,后面会说),找出重复的数据,想办法处理。

在极少数情况下,可能希望直接删除重复的值。创建索引时使用"dropDups"选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。

>  db.dept.ensureIndex({"name":1},{"unique":true,"dropDups":true})  
    {  
            "createdCollectionAutomatically" : false,  
            "numIndexesBefore" : 1,  
            "numIndexesAfter" : 2,  
            "ok" : 1  
    }

"dropDups"会强制性的建立唯一索引,但是这个方式太粗暴了:你无法控制那些文档需要被保留,那些文档需要被删除(从上面打印的信息可以看出,如果文档被删除了,MongoDB也不会给出提示信息)。对于比较重要的数据,千万不要使用"dropDups".

参考实例六:创建稀疏索引

唯一索引会把null值看做值,所以无法将缺少键的多个文档插入到建立的唯一索引的集合中。然而,在某些情况下,你可能希望唯一索引只针对包含相应键的文档生效。如果有一个可能存在也有可能不存在的字段,当字段存在时是唯一索引,不存时不做处理,这时就可以将unique和sparse选项组合在一起使用。

使用sparse选项就可以创建稀疏索引。例如集合的结构如下:

> db.sparse.find()  
    { "_id" : 1, "x" : 1 }  
    { "_id" : 2, "x" : 2 }  
    { "_id" : 3, "x" : null }  
    { "_id" : 4 }

创建稀疏索引

> db.sparse.ensureIndex({"x":1},{"unique":true,"sparse":true})

稀疏索引不必是唯一的。只要去掉unique选项,就可以创建一个非唯一的稀疏索引

MongoDB的稀疏索引与关系型数据库中的稀疏索引是完全不同的概念。基本上来说,MongoDB中的稀疏索引只是不需要将每个文档都作为索引条目。那么问题来了,根据是否使用稀疏索引,同一个查询的返回结果可能不同。

例如上面文档,当在x上面执行查询时,他会返回相应匹配的文档:

> db.sparse.find({"x":{"$ne":1}}).hint({}) --hint({})强制不使用索引  
    { "_id" : 2, "x" : 2 }  
    { "_id" : 3, "x" : null }  
    { "_id" : 4 }

如果在x字段上面使用索引,那么{ "_id" : 4 }的文档将不会返回,因为他不在索引中,例如:

> db.sparse.find({"x":{"$ne":1}}).hint({"x":1})  
    { "_id" : 3, "x" : null }  
    { "_id" : 2, "x" : 2 }

二、查看索引

所有数据库索引信息都存储在system.indexes集合中。这是一个保留集合,不能在其中插入或者删除文档。只能通过ensureIndex({...})或者dropIndexes对他进行操作:

参考实例一:查看所有数据库建立的索引详情

> db.system.indexes.find()  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.users" }  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.dept" }  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.food" }  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.emp" }  
    { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.blog" }  
     ................省略!

 参考实例二:查看特定集合的索引信息

> db.users.getIndexes()  
    [  
            {  
                    "v" : 1,  
                    "key" : {  
                            "_id" : 1  
                    },  
                    "name" : "_id_",  
                    "ns" : "test.users"  
            },  
            {  
                    "v" : 1,  
                    "key" : {  
                            "name" : 1,  
                            "age" : 1  
                    },  
                    "name" : "name_1_age_1",  
                    "ns" : "test.users"  
            }  
    ]  
    >

这里最重要的字段是key和name,key说明了你创建索引时字段跟排序,name就是索引的名称,默认为key_dir_key_dir....的格式,"v"字段只在内部使用,用于标识索引的版本。如果你的索引不包含“v”:1这样的字段,说明你的索引是一种效率比较低的旧方式存储的。将MongoDB升级到至少2.0的版本,删除并重建这些索引,就可以把所有的存储方式升级到新的格式了。

 参考实例三:查看特定集合的索引信息

查询索引大小

db.COLLECTION_NAME.totalIndexSize()

三、标识索引

集合中的每一个索引都有一个名称,用于唯一标识索引,也可以用于服务器端来删除索引。索引默认的命名方式是key1_dir1_key2_dir2....keyn_dirn,其中key就是索引的键,dir是索引的排序方向(1或者-1),如果索引中包含的键比较多,这种默认的命名方式就显得比较笨重,可以再创建索引时指定索引的名称。

参考实例:

> db.users.ensureIndex({"name":1,"age":1},{"name":"name_age1"})

温馨提示:MongoDB索引名称的长度有限,所以新建复杂索引时可能需要自定义索引名称.

四、删除索引

参考实例一:删除集合里面的所有索引

> db.users.dropIndexes()

 参考实例二:根据索引的key或者name删除集合里面的指定索引

> db.users.dropIndex("name_1_age_1")--根据索引的name删除  
    > db.users.dropIndex({"name":1,"age":1})--根据索引的key删除

MongoDB索引管理的更多相关文章

  1. MongoDB索引管理-索引的创建、查看、删除

    索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ...

  2. 【四】MongoDB索引管理

    一.索引介绍 在mongodb中,索引用来支持高效查询.如果没有索引,mongodb必须在整个集合中扫描每个文档来查找匹配的文档.但是如果建立合适的索引,mongodb就可以通过索引来限制检查的文档数 ...

  3. 分布式文档存储数据库之MongoDB索引管理

    前文我们聊到了MongoDB的简介.安装和对collection的CRUD操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13941797.html:今天我 ...

  4. mongoDB索引相关

    参考链接:MongoDB索引管理-索引的创建.查看.删除 索引 db.集合名.ensureIndex({"key":1}) 使用了ensureIndex在name上建立了索引.”1 ...

  5. mongodb数据库索引管理

    1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...

  6. MongoDB 索引的使用, 管理 和优化

    MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报  分类: MongoDB(9)  [使用explain和hint] 前面讲高级查询 ...

  7. MongoDB基本管理命令

    MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中 可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由 ...

  8. NoSQL学习二:MongoDB基本管理命令

    MongoDB命令学习  一.MongoDB命令帮助 在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控: 这是MongoDB最上层 ...

  9. MongoDB索引的使用

    Table of Contents 1. 基本索引 2. 联合索引 3. 索引类型 4. 索引管理 1 基本索引 在数据库开发中索引是非常重要的,对于检索速度,执行效率有很大的影响.本 文主要描述了M ...

随机推荐

  1. PHP中判断字符串是否包含某个字符时,建议使用正则表达式preg_match()

    判断字符串中是否包含 某个字符时,在java中时直接使用 indexOf()来判断的 在php中好像也要对应的,strpos(),stripos() 不过每次我用的都很不爽,老是出现各种各样的小问题, ...

  2. MySQL触发器基本使用

    文章参考:这里 MySQL中,创建触发器的基本语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EA ...

  3. 如何通过 PHP 获取 Azure Active Directory 令牌

    在调用 Azure Rest API 时,如果是属于 Azure Resource Manager 的 API,则需要使用 Azure Active Directory (Azure AD)认证获取令 ...

  4. smarty assign 赋值

    assign赋值 void assign (mixed var) void assign (string varname, mixed var) This is used to assign valu ...

  5. ps命令详解加例子

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  6. [Erlang]各种系统限制总结

    Erlang本身对进程数,原子长度等没有限制,但为了提高性能和节省内存,总会在实际实现中和运行环境中作出一些限制. 1.进程数量 缺省情况下同时存在的最大Erlang进程数量不超过2^18=26214 ...

  7. 工厂模式的C++、Java实现

    1.工厂模式UML 图1. 工厂模式UML 2.C++实现 类视图如下: 图2. 工厂模式C++实现的类图 其中,Factory实现为: //工厂类. class Factory { public: ...

  8. svn的使用总结

    在网上看到了以前介绍非常全的svn的文章,拿来分享 原文网址  http://www.cnblogs.com/jx270/archive/2013/03/04/2943595.html 还有一篇更基础 ...

  9. Effective C++ .33 子类的名称覆盖

    #include <iostream> #include <cstdlib> using namespace std; class Base { public: int add ...

  10. PHP支持多线程吗?

    https://zhidao.baidu.com/question/2053529640037778107.html