MongoDB教程
第十二章 MongoDB索引
##索引命令 #### 创建索引:ensureIndex() - 语法:db.COLLECTION_NAME.ensureIndex({KEY:1}) >语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。 - 可选参数: | 参数 | 类型 | 描述 | | ----- | ----- | ----- | | 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. | - 实例: ```shell db.mycol.ensureIndex({"title":1}) db.demo_3.ensureIndex({m:1,n:1},{unique:true}) #类似关系型数据库字段的唯一约束 db.mycol.ensureIndex({"title":1,"description":-1}) db.values.ensureIndex({open: 1, close: 1}, {background: true}) ``` #### 删除索引:dropIndex() - 语法:db.collection_name.dropIndex(index) >其中 index 用来指定要删除的索引,可以是索引名称key的形式,也可以是{key:1}的形式。 - 实例 ```shell db.course.dropIndex({"title":1}) ``` #### 删除索引:dropIndexes() >与 dropIndex() 方法不同 dropIndexes() 方法可以同时删除集合中的多个索引. 在使用 dropIndexes() 方法不需要提供任何参数。 - 语法 : db.collection_name.dropIndexes() - 例子: db.course.dropIndexes() ####获取集合中所有索引:getIndexes() >该方法不需要提供任何参数 - 语法:db.collection_name.getIndexes() ## 高级索引 ####索引数组字段 - 假设要想根据集合内 tags 字段中的某个值来搜索用户文档,就需要我们为集合中的 tags 字段创建索引。想要在数组类型的字段上创建索引,需要为数组中的每个字段依次创建单独的索引。 - 在下面的示例中,当我们在 tags 字段上创建索引时,MongoDB 会自动在 music、-- cricket 和 blogs 等值上创建单独的索引。 ```shell > db.users.createIndex({"tags":1}) ``` - 索引创建成功后,可以这样搜索集合中的文档: ```shell > db.users.find({tags:"cricket"}).pretty() ``` - 若要验证在搜索的过程中是否正确的使用了索引,可以使用 explain() 方法。 ```shell > db.users.find({tags:"cricket"}).explain() ``` ####索引子文档字段 - 假设我们要根据 address 子文档的 city、country、postcode 等字段来搜索文档,由于所有这些字段都是 address 子文档的一部分,所以我们需要为子文档上的所有字段创建索引。 - 要在子文档的所有三个字段上创建索引,可以使用如下所示的代码: ```shell > db.users.ensureIndex({"address.city":1,"address.country":1,"address.postcode":1}) ``` - 索引创建成功后,我们就可以使用 address 子文档中的任何字段来搜索集合中的数据了,如下所示: ```shell > db.users.find({"address.city":"Hebei"}).pretty() ``` - 另外,在查询时也可以设置多个查询条件,如下所示: ```shell > db.users.find({"address.city":"Hebei", "address.country":"China"}).pretty() ``` ##索引限制 - 额外开销:每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。 - 内存(RAM)使用:由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。 - 索引不能被以下的查询使用: 正则表达式及非操作符,如 $nin, $not, 等。 算术运算符,如 $mod, 等。 $where 子句。 - 索引键限制:从2.6版本开始,如果现有的索引字段的值超过索引键的限制,MongoDB中不会创建索引。 - 插入文档超过索引键限制:如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引的集合。与mongorestore和mongoimport工具类似。 - 最大范围 集合中索引不能超过64个 索引名的长度不能超过128个字符 一个复合索引最多可以有31个字段 ##全文索引 全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。目前支持15种语言的全文索引,暂时不支持中文。 #### 启用全文检索 - MongoDB 在 2.6 版本以后是默认开启全文检索的,如果你使用之前的版本,你需要使用以下代码来启用全文检索: ```sql >db.adminCommand({setParameter:true,textSearchEnabled:true}) ``` - 或者使用命令: ```sql mongod --setParameter textSearchEnabled=true ``` ####创建全文索引 - 考虑以下 posts 集合的文档数据,包含了文章内容(post_text)及标签(tags),我们可以对 post_text 字段建立全文索引,这样我们可以搜索文章内的内容: ```sql >db.posts.ensureIndex({post_text:"text"}) ``` ####使用全文索引 - 现在我们已经对 post_text 建立了全文索引,我们可以搜索文章中的关键词 keepStudy: ```sql >db.posts.find({$text:{$search:"keepStudy"}}) ``` - 如果你使用的是旧版本的 MongoDB,你可以使用以下命令: ```sql >db.posts.runCommand("text",{search:"keepStudy"}) ``` #### 删除全文索引 ```sql db.posts.dropIndex(index) ```
顶部
收展
底部
[TOC]
目录
第一章 NoSQL和MongoDB简介
第二章 MongoDB安装
第三章 MongoDB概念
第四章 MongoDB数据类型
第五章 MongoDB连接数据库
第六章 MongoDB数据库增删查
第七章 MongoDB集合增删查
第八章 MongoDB文档增删查改
第九章 MongoDB查询构造器
第十章 MongoDB备份与恢复
第十一章 MongoDB复制(副本集)
第十一章 MongoDB分片
第十一章 MongoDB监控
第十二章 MongoDB索引
相关推荐
MongoDB进阶
PHP操作MongoDB
MongoDB用户及安全
MongoDB优化