MongoDB中索引的类型大致包含单键索引、复合索引、多键值索引、地理索引、全文索引、散列索引等。下面简单介绍各类索引的用法,关于索引的详细使用方法可参考官网手册。
MongoDB支持文档集合中任何字段的索引,在默认情况下,所有集合在_id字段上都有一个索引,应用程序和用户可以添加额外的索引来支持重要的查询操作,单键索引可参考如图2.8所示。
图2.8 单键索引示意图
对于单字段索引和排序操作,索引键的排序顺序(即升序或降序)无关紧要,因为MongoDB可以在任意方向上遍历索引,创建单键索引的语法结构如下:
以下示例为插入一个文档,并在score键上创建索引,具体步骤如下:
使用score字段进行查询,再使用explain()函数,可以查看查询过程:
MongoDB支持复合索引,其中复合索引结构包含多个字段。如图2.9所示说明了两个字段的复合索引示例。
图2.9 复合索引示意图
复合索引可以支持在多个字段上进行的匹配查询,语法结构如下:
需要注意的是,在建立复合索引的时候一定要注意顺序的问题,顺序不同将导致查询的结果也不相同。如下语句创建复合索引:
查看复合索引的查询计划的语法如下:
若要为包含数组的字段建立索引,MongoDB会为数组中的每个元素创建索引键。这些多键值索引支持对数组字段的高效查询,如图2.10所示。
图2.10 多键值索引示意图
创建多键值索引的语法如下:
需要注意的是,如果集合中包含多个待索引字段是数组,则无法创建复合多键索引。
以下示例代码展示插入文档,并创建多键值索引:
地理索引包含两种地理类型,如果需要计算的地理数据表示为类似于地球的球形表面上的坐标,则可以使用2dsphere索引。通常可以按照坐标轴、经度、纬度的方式把位置数据存储为GeoJSON对象。GeoJSON的坐标参考系使用的是wgs84数据。如果需要计算距离(在一个欧几里得平面上),通常可以按照正常坐标对的形式存储位置数据,可使用2d索引。
使用2dsphere索引的语法结构如下:
使用2d索引的语法结构如下:
这里以2dsphere为示例,创建地理索引:
MongoDB在地理空间查询方面还有很多的应用,读者可以进行适当的拓展。
(1) 全文索引
MongoDB的全文检索提供三个版本,用户在使用时可以指定相应的版本,如果不指定则默认选择当前版本对应的全文索引。MongoDB提供的文本索引支持对字符串内容的文本搜索查询,但是这种索引因为需要检索的文件比较多,因此在使用的时候检索时间较长。语法结构如下:
(2) 散列索引
散列(Hashed)索引是指按照某个字段的散列值来建立索引,目前主要用于MongoDB Sharded Cluster的散列分片,散列索引只能用于字段完全匹配的查询,不能用于范围查询等。其语法如下:
MongoDB支持散列任何单个字段的索引,但是不支持多键(即数组)索引。
需要说明的是,MongoDB 在进行散列索引之前,需要将浮点数截断为64位整数。例如,散列将对2.3、2.2和2.9这些值产生同样的返回值。
上面列出的都是索引的类别,在每个索引的类别上还可以加上一些参数,使索引更加具有针对性,常见的参数包括稀疏索引、唯一索引、过期索引等。
稀疏索引只检索包含具有索引字段的文档,即使索引字段包含空值,检索时也会跳过所有缺少索引字段的文档。因为索引不包含集合的所有文档,所以说索引是稀疏的。相反,非稀疏索引包含集合中的所有文档,存储不包含索引字段的文档的空值。设置稀疏索引的语法如下:
如果设置了唯一索引,新插入文档时,要求key的值是唯一的,不能有重复的出现,设置唯一索引的语法如下:
过期索引是一种特殊的单字段索引,MongoDB可以用来在一定时间或特定时间后从集合中自动删除文档。过期索引对于处理某些类型的信息非常有用,例如,机器生成的事务数据、日志和会话信息,这些信息只需要在数据库中存在有限的时间,不需要长期保存。创建过期索引的语法如下:
需要注意的是,MongoDB是每60s执行一次删除操作,因此短时间内执行会出现延迟现象。