一、Indexes
索引支持在MongoDB中高效执行查询。没有 索引,MongoDB必须执行集合扫描,即扫描每个 集合中的文档,以选择与 查询语句。如果查询存在适当的索引, MongoDB可以使用索引来限制它必须的文档数量 检查。
索引是特殊的数据结构 ,它存储一个小 集合数据集的一部分,以易于遍历的形式呈现。这 索引存储特定字段或一组字段的值,排序方式为 字段的值。索引条目的排序支持 高效的相等匹配和基于范围的查询操作。在 此外,MongoDB可以使用排序返回排序结果 索引。
下图说明了一个查询,该查询选择并排序 使用索引匹配文档:
从根本上说,MongoDB中的索引类似于其他索引 数据库系统。MongoDB在收集级别并支持文档的任何字段或子字段上的索引 在 MongoDB 集合中。
二、Default _id
Index
在创建集合的过程中,MongoDB会在_id字段上创建一个唯一的索引。_id索引防止客户端插入两个具有相同_id字段值的文档。不能在_id字段上删除此索引。
在分片集群中,如果不使用_id字段作为分片键,则应用程序必须确保_id字段中的值的唯一性,以防止出现错误。这通常是通过使用标准的自动生成的ObjectId来完成的。
三、创建索引
使用右上角的“选择您的语言”下拉菜单设置此页面上示例的语言。
要在MongoShell中创建索引,请使用db.collection.createIndex()。
db.collection.createIndex( <key and index type specification>, <options> )
以下示例在名称字段上创建一个单键降序索引:
db.collection.createIndex( { name: -1 } )
只有在不存在相同规范的索引时,db.collection.createIndex()方法才会创建索引。
1、索引名称
索引的默认名称是索引键和索引中每个键的方向(即1或-1)的串联,使用下划线作为分隔符。例如,在{item:1,quantity:-1}上创建的索引的名称为item_1_quantity_-1。
您可以使用自定义名称创建索引,例如一个比默认名称更易于阅读的名称。例如,考虑一个经常查询产品集合以填充现有库存数据的应用程序。下面的createIndex()方法为库存创建一个名为query的项目和数量索引:
db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
您可以使用db.collection.getIndexes()方法查看索引名称。索引一旦创建,就不能重命名。相反,您必须删除索引并使用新名称重新创建索引。
2、索引类型
MongoDB提供了许多不同的索引类型来支持特定的 数据类型和查询
单个字段
除了MongoDB定义的_id索引外,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引。
对于单个字段的索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何一个方向上遍历索引。
有关单字段索引的详细信息,请参见单字段索引和使用单字段索引排序。
复合索引
MongoDB还支持多个字段上的自定义索引,即复合索引。
在复合索引中列出的字段的顺序具有重要意义。例如,如果复合索引由{userid:1,score:-1}组成,则该索引首先按userid排序,然后在每个userid值内按score排序。
对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以决定索引是否支持排序操作。有关索引顺序对复合索引中结果的影响的详细信息,请参见排序顺序。
多键索引
创建多关键字索引
要创建多关键字索引,请使用db.collection.createIndex()方法:
db.coll.createIndex( { <field>: < 1 or -1 > } )
如果任何索引字段是数组,MongoDB会自动创建一个多关键字索引;您不需要显式指定多密钥类型。