4.7 其他索引特性
除了前面介绍的索引,MongoDB还支持一些特殊的索引类别及特性。下面具体介绍。
4.7.1 条件索引
条件(partial)索引允许你只对部分文档建立索引,这是一种很特殊的用途。
例如,仅对业务上最常用于查询的数据集创建索引,可以节省一些空间。可根据如下代码创建条件索引:
上述代码表示,只对评分高于5分的餐馆信息进行索引。
4.7.2 稀疏索引(sparse=true)
由于MongoDB非结构化的特性,一个集合中允许结构不完全相同的两个文档共存。这意味着,对某个索引字段来说,可能某些文档中并不存在该字段,但MongoDB索引会将不存在字段的情况等同于null值处理。稀疏索引则具备这样的特性:只对存在字段的文档进行索引(包括字段值为null的文档)。
例如:
这里写入两个文档,第1个文档仅包含x字段,而第2个文档包含x、z两个字段,其中z值为null。
对集合进行检索,代码如下:
会发现两个文档同时被返回了。
接下来,对z字段建立一个稀疏索引,代码如下:
使用建立的稀疏索引进行查询,会发现只有包含z字段(值为null)的文档被返回了,结果如下:
4.7.3 文本索引
MongoDB支持全文检索功能,可通过建立文本索引来实现简易的分词检索。
预置数据如下:
创建文本索引,代码如下:
这里为stories集合创建了一个文本索引,该索引同时包含对title、summary字段的分词检索。
使用$text操作符进行文本搜索,代码如下:
$text操作符会将$search文本输入进行分词再检索,如上述代码会检索出含有monkey或sky关键词的文档。
MongoDB的文本索引功能存在诸多限制,而官方并未提供中文分词的功能,这使得该功能的应用场景十分受限。
4.7.4 模糊索引
MongoDB的文档模式是动态变化的,而模糊索引(wildcard index)可以建立在一些不可预知的字段上,以此实现查询的加速。需要注意的是,该功能是MongoDB 4.2版本才推出的新特性,在此之前的版本并不支持。
通过模糊索引,商品属性的检索变得更加容易了,例如:
其中,attributes作为嵌套文档存放了商品的多个属性,而不同商品所具有的属性很可能是不一样的。
接下来创建一个模糊索引,代码如下:
attributes.$**表示该索引将匹配以attributes字段作为开始路径的任何一个字段。
这个索引可以匹配下面的任意一种查询: