其他分享
首页 > 其他分享> > Mongo笔记12-索引

Mongo笔记12-索引

作者:互联网

索引支持MongoDB中查询的高效执行。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。如果查询存在适当的索引,MongoDB可以使用该索引来限制它必须检查的文档的数量。

索引是特殊的数据结构[1],它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或字段集的值,按字段的值排序。索引项的排序支持高效的相等匹配和基于范围的查询操作。此外,MongoDB可以使用索引中的排序返回排序后的结果。

 

 

 

默认_id索引

MongoDB在创建集合期间在_id字段上创建一个惟一的索引。_id索引防止客户机为_id字段插入两个值相同的文档。不能在_id字段上删除该索引。

在分片集群中,如果不使用_id字段作为分片键,那么应用程序必须确保_id字段中的值的唯一性,以防止错误。这通常是通过使用标准的自动生成的ObjectId来完成的

 

创建索引语法

db.collection.createIndex( <key and index type specification>, <options> )

 

索引类型

1.单字段索引(Single Field)

除了MongoDB定义的_id索引,MongoDB还支持在文档的单个字段上创建用户定义的升序/降序索引.

db.collection.createIndex( { score: 1 } )

db.records.createIndex( { "location.state": 1 } )

 

对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任意方向上遍历索引。

 

2.复合索引(Compound Index)

复合索引中字段的顺序具有重要意义。例如,如果一个复合索引由{userid: 1, score: -1}组成,那么索引首先按userid排序,然后在每个userid值中按分数排序。

值1指定按升序排列项的索引。值-1指定按降序排列项的索引。有关其他索引类型,请参见索引类型。

格式:

db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

db.collection.createIndex( { userId:1, score: -1 } )

 

 

 

对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以决定索引是否支持排序操作。有关索引顺序对复合索引中的结果的影响的更多信息,请参见排序顺序。

See Compound Indexes and Sort on Multiple Fields for more information on compound indexes.

Sort Order

索引以升序(1)或降序(-1)的排序顺序存储对字段的引用。对于单字段索引,键的排序顺序并不重要,因为MongoDB可以在任意方向上遍历索引。但是,对于复合索引,排序顺序在决定索引是否支持排序操作时很重要。

考虑一个包含username和date字段的文档的集合事件。应用程序可以发出查询,返回按升序username值排序的结果,然后按降序(即最近到最近的)date值排序的结果,如:

db.events.find().sort( { username: 1, date: -1 } )

或查询返回的结果,先按username降序排序,然后按date升序排序,如:

db.events.find().sort( { username: -1, date: 1 } )

 

3.多键索引(Multikey Index)

MongoDB使用多键索引对存储在数组中的内容进行索引。如果索引一个包含数组值的字段,MongoDB将为数组的每个元素创建单独的索引条目。这些多键索引允许查询通过匹配一个或多个数组的元素来选择包含数组的文档。MongoDB自动决定是否创建一个多键索引,如果索引字段包含一个数组值;您不需要显式地指定多密钥类型。

 

对于惟一索引,惟一约束适用于集合中不同的文档,而不是单个文档中。

因为惟一约束适用于单独的文档,对于惟一的多键索引,文档可能具有导致重复索引键值的数组元素,只要该文档的索引键值不重复另一个文档的索引键值。

 

格式:db.coll.createIndex( { <field>: < 1 or -1 > } )

db.collection.createIndex( { addr.zip:1 } )

See Multikey Indexes and Multikey Index Bounds for more information on multikey indexes

 

查询整个数组字段

当查询筛选器为整个数组指定精确匹配时,MongoDB可以使用多键索引查找查询数组的第一个元素,但不能使用多键索引扫描查找整个数组。相反,在使用multikey索引查找查询数组的第一个元素之后,MongoDB将检索相关文档,并筛选其数组与查询中的数组匹配的文档。

例如,考虑一个包含以下文档的库存集合:

 

{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] }

{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] }

{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] }

{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] }

{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }

 

db.inventory.createIndex( { ratings: 1 } )

查找数组为[5,9]的文档

MongoDB可以使用多键索引来查找在ratings数组中任意位置有5的文档。然后,MongoDB检索这些文档,并对其ratings数组等于查询数组[5,9]的文档进行筛选。

db.inventory.find( { ratings: [ 5, 9 ] } )

地理空间索引(Geospatial Index)

 

文本索引(Text Indexes)

支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如“the”、“a”或“or”),并且对集合中的词进行词干处理,只存储根词。

 

要创建文本索引,请使用db.collection.createIndex()方法。若要索引包含字符串或字符串元素数组的字段,请包含该字段并在索引文档中指定字符串文字“text”,如下面的示例所示:

db.reviews.createIndex( { comments: "text" } )

db.reviews.createIndex(

{

subject: "text",

comments: "text"

}

)

为了避免创建名称超过索引名称长度限制的索引,可以将name选项传递给db.collection.createIndex()方法:

db.collection.createIndex(

{

content: "text",

"users.comments": "text",

"users.profiles": "text"

},

{

name: "MyTextIndex"

}

)

否则索引的默认名字:"content_text_users.comments_text_users.profiles_text"

哈希索引(Hashed Indexes)

为了支持基于散列的分片,MongoDB提供了一种散列索引类型,它对字段值的散列进行索引。这些索引的值在其范围内具有更随机的分布,但只支持相等匹配,不支持基于范围的查询。

不能创建具有散列索引字段的复合索引,也不能在散列索引上指定唯一约束;但是,您可以在同一个字段上创建散列索引和升序/降序(即非散列)索引:MongoDB将使用标量索引进行范围查询。

格式:db.collection.createIndex( { _id: "hashed" } )

 

唯一索引(Unique Indexes)

索引的唯一属性会导致MongoDB拒绝索引字段的重复值。除了惟一约束之外,惟一索引在功能上可与其他MongoDB索引互换。

db.collection.createIndex( <key and index type specification>, { unique: true } )

db.members.createIndex( { "user_id": 1 }, { unique: true } )

db.members.createIndex( { groupNumber: 1, lastname: 1, firstname: 1 }, { unique: true } )

db.collection.createIndex( { "a.loc": 1, "a.qty": 1 }, { unique: true } )

 

稀疏索引(Sparse Indexes)

索引的稀疏属性确保索引只包含具有索引字段的文档的条目。索引跳过没有索引字段的文档。

您可以将稀疏索引选项与惟一索引选项组合起来,以拒绝具有字段重复值但忽略没有索引键的文档。

格式:

db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } )

 

查询索引

db.collections.getIndexes()

查看集合上索引所占存储空间

db.collection.totalIndexSize()

 

删除索引

删除指定索引

db.accounts.dropIndex( { "tax-id": 1 } )

 

删除全部索引

db.accounts.dropIndexes()

详细介绍:

https://docs.mongodb.com/manual/reference/method/db.collection.dropIndex/#db.collection.dropIndex

 

 

 

 

标签:12,Mongo,MongoDB,db,索引,文档,createIndex,id
来源: https://blog.csdn.net/Linzhongyilisha/article/details/88084785