Comment on page
MongoDB索引
在本页面
索引支持在MongoDB中有效地执行查询。如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择那些与查询语句匹配的文档。如果一个查询存在适当的索引,MongoDB可以使用该索引来限制它必须检查的文档数量。
索引是特殊的数据结构,它以一种易于遍历的形式存储集合数据集的一小部分。索引存储一个或一组特定字段的值,按字段的值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以通过使用索引中的排序返回排序后的结果。
下图说明了使用索引选择和排序匹配文档的查询:
使用索引选择并返回排序结果的查询图。 索引按升序存储“分数”值。 MongoDB可以按升序或降序遍历索引以返回排序的结果。
db.collection.createIndex( <key and index type specification>, <options> )
以下示例在
name
字段上创建单个键降序索引:db.collection.createIndex( { name: -1 } )
索引的默认名称是索引键和索引中每个键的方向(即1或-1)的连接,使用下划线作为分隔符。例如,在**{ item : 1, quantity: -1 }上创建的索引名称为item_1_quantity_-1**。
您可以创建具有自定义名称的索引,比如比默认名称更易于阅读的索引。例如,考虑一个经常查询
products
集合以填充现有库存数据的应用程序。下面的createIndex()
方法在名为查询的商品和数量上创建一个索引:db.products.createIndex(
{ item: 1, quantity: -1 } ,
{ name: "query for inventory" }
)
MongoDB提供了许多不同的索引类型来支持特定类型的数据和查询。
``分数''字段上的索引图(升序)。
对于单字段索引和排序操作,索引键的排序顺序(升序或降序)并不重要,因为MongoDB可以从任何方向遍历索引。
复合索引中列出的字段的顺序具有重要意义。例如,如果一个复合索引由**{userid: 1, score: -1}组成,索引首先按userid排序,然后在每个userid值内按score**排序。
在userid字段(升序)和score字段(降序)上的复合索引图。 索引首先按“ userid”字段排序,然后按“ score”字段排序。
addr.zip字段上的多键索引图。 addr字段包含地址文档数组。 地址文档包含``zip''字段。
为了支持对地理空间坐标数据的高效查询,MongoDB提供了两个特殊的索引:在返回结果时使用平面几何的2d索引和使用球面几何返回结果的2dsphere索引。
MongoDB提供了一种文本索引类型,它支持搜索集合中的字符串内容。这些文本索引不存储特定于语言的停止词(例如**“the”,“a”,“or”**),并且在一个集合中只存储根词的词干。
3.2版中的新功能。
部分索引提供了稀疏索引功能的超集 ,因此应优先于稀疏索引。
可以将稀疏索引与唯一索引结合使用,以防止插入索引字段值重复的文档,并跳过索引缺少索引字段的文档。
TTL索引是MongoDB可以使用的特殊索引,它可以在一定时间后自动从集合中删除文档。对于某些类型的信息(例如计算机生成的事件数据,日志和会话信息),它们仅需要在数据库中保留有限的时间,这是理想的选择。
3.4版的新功能。
- 1.Mongo Shell
- 2.Compass[success] Note下面的示例演示了Mongo Shell中的索引和排序。请参阅MongoDB Compass文档,了解如何使用自定义排序法与Compass中的索引。
- 3.Python[success] Note下面的示例演示了Mongo Shell中的索引和排序。参考驱动程序文档,了解如何在特定驱动程序中使用排序创建索引。
- 4.Java[success] Note下面的示例演示了Mongo Shell中的索引和排序。参考驱动程序文档,了解如何在特定驱动程序中使用排序创建索引。
- 5.Node.js[success] Note下面的示例演示了Mongo Shell中的索引和排序。参考驱动程序文档,了解如何在特定驱动程序中使用排序创建索引。
若要使用索引进行字符串比较,操作还必须指定相同的排序。也就是说,如果索引指定了不同的排序,则具有排序的索引不能支持对索引字段执行字符串比较的操作。
例如,该集合
myColl
在category
具有排序规则语言环境的字符串字段上具有索引"fr"
。db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
下面的查询操作指定了与索引相同的排序,可以使用索引:
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
但是,以下查询操作(默认情况下使用“简单”二进制整理程序)无法使用索引:
db.myColl.find( { category: "cafe" } )
对于索引前缀键不是字符串、数组和嵌入式文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。
例如,集合myColl有一个关于数值字段score和price以及字符串字段类别的复合索引;索引是用collation locale **"fr"**创建的,用于字符串比较:
db.myColl.createIndex(
{ score: 1, price: 1, category: 1 },
{ collation: { locale: "fr" } } )
使用
"simple"
二进制排序规则进行字符串比较的以下操作可以使用索引:db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
以下操作使用
"simple"
二进制排序规则对索引category
字段进行字符串比较,该操作可以使用索引来完成查询的一部分:score: 5
db.myColl.find( { score: 5, category: "cafe" } )
仅使用索引来匹配查询条件并返回结果的查询图。 MongoDB无需检查索引之外的数据即可完成查询。