![MongoDB进阶与实战:微服务整合、性能优化、架构管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/38209697/b_38209697.jpg)
4.7 其他索引特性
除了前面介绍的索引,MongoDB还支持一些特殊的索引类别及特性。下面具体介绍。
4.7.1 条件索引
条件(partial)索引允许你只对部分文档建立索引,这是一种很特殊的用途。
例如,仅对业务上最常用于查询的数据集创建索引,可以节省一些空间。可根据如下代码创建条件索引:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_1.jpg?sign=1738888031-hFSVycwn3BalCTMj5sexLop9Z76fSElE-0-0ffefb314a6ebadd948c11f54efeca00)
上述代码表示,只对评分高于5分的餐馆信息进行索引。
4.7.2 稀疏索引(sparse=true)
由于MongoDB非结构化的特性,一个集合中允许结构不完全相同的两个文档共存。这意味着,对某个索引字段来说,可能某些文档中并不存在该字段,但MongoDB索引会将不存在字段的情况等同于null值处理。稀疏索引则具备这样的特性:只对存在字段的文档进行索引(包括字段值为null的文档)。
例如:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_2.jpg?sign=1738888031-IvrCCIB3qBkLQoKsrkQbC7LECJCOJOfx-0-a5510f5fa2428f5ae71ba7735af28d9d)
这里写入两个文档,第1个文档仅包含x字段,而第2个文档包含x、z两个字段,其中z值为null。
对集合进行检索,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_3.jpg?sign=1738888031-DGLYs0xK4XiL70QWp2WV1uzMyo1Robux-0-05bc05b5a7e38732724bdaa0db4fea92)
会发现两个文档同时被返回了。
接下来,对z字段建立一个稀疏索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_4.jpg?sign=1738888031-aQtFBD4GOKdEyRXyCpkGwS8yzHz89Arn-0-1944e8669d77fef33dc93aee7c8341b6)
使用建立的稀疏索引进行查询,会发现只有包含z字段(值为null)的文档被返回了,结果如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_1.jpg?sign=1738888031-Urovn0SYWJpMqNp1qTqJmRnJavZc7jcL-0-1364485f980f8e7a16290b3430c6e6d4)
4.7.3 文本索引
MongoDB支持全文检索功能,可通过建立文本索引来实现简易的分词检索。
预置数据如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_2.jpg?sign=1738888031-JXvTuMRZ6B4IbuuKxiL1zTogtAZygTuc-0-71db517c92340e2eaca13fba84258194)
创建文本索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_3.jpg?sign=1738888031-AiSXB0sX64bhF0owwKj9gK3lYFm6K6r0-0-df05fa731fa6630e0837c4371df32e04)
这里为stories集合创建了一个文本索引,该索引同时包含对title、summary字段的分词检索。
使用$text操作符进行文本搜索,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_4.jpg?sign=1738888031-07GGMPKO0rgAWEtgOQY9tkwTaAZhspnZ-0-d432cfd35f4485d3962d2f7ad4c2d1d9)
$text操作符会将$search文本输入进行分词再检索,如上述代码会检索出含有monkey或sky关键词的文档。
MongoDB的文本索引功能存在诸多限制,而官方并未提供中文分词的功能,这使得该功能的应用场景十分受限。
4.7.4 模糊索引
MongoDB的文档模式是动态变化的,而模糊索引(wildcard index)可以建立在一些不可预知的字段上,以此实现查询的加速。需要注意的是,该功能是MongoDB 4.2版本才推出的新特性,在此之前的版本并不支持。
通过模糊索引,商品属性的检索变得更加容易了,例如:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_5.jpg?sign=1738888031-0W8G4nFIkdsZugHbAZDBbXZLejmoNb2o-0-db5f841bf87b3d2b38fb8c42c440a196)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_1.jpg?sign=1738888031-dBeMObfhrA3gLImvLeiDRaOYCup1JiVN-0-4d91b33e2b3bc989aeafefd7f09f19b0)
其中,attributes作为嵌套文档存放了商品的多个属性,而不同商品所具有的属性很可能是不一样的。
接下来创建一个模糊索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_2.jpg?sign=1738888031-cVIHwytuWt7PpktYMn67M7TST5eEz6IY-0-b5abf184fc12a974186c9a719ca6608d)
attributes.$**表示该索引将匹配以attributes字段作为开始路径的任何一个字段。
这个索引可以匹配下面的任意一种查询:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_3.jpg?sign=1738888031-4X4V0uQSybnwbPnl6IMoEv8Acc6c6msB-0-f406da07af2b3c5cd5a1cdc6f2f84e01)