![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=1738855182-m8aLRtBF6MeboNEq08KHDJPoR0PrHqym-0-820f6e2cd8a5305a382e0f98e1686c50)
上述代码表示,只对评分高于5分的餐馆信息进行索引。
4.7.2 稀疏索引(sparse=true)
由于MongoDB非结构化的特性,一个集合中允许结构不完全相同的两个文档共存。这意味着,对某个索引字段来说,可能某些文档中并不存在该字段,但MongoDB索引会将不存在字段的情况等同于null值处理。稀疏索引则具备这样的特性:只对存在字段的文档进行索引(包括字段值为null的文档)。
例如:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_2.jpg?sign=1738855182-X1qDrf1cRoh8OzMu0H0B6t1ID6MWwZR1-0-d40d67f64a9291416f355b114151b1c5)
这里写入两个文档,第1个文档仅包含x字段,而第2个文档包含x、z两个字段,其中z值为null。
对集合进行检索,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_3.jpg?sign=1738855182-CEkAC1ySsH1FyCJCKcGMzGFkMKwzyzHw-0-3166a6ac03b2fb904862b91bdbee446d)
会发现两个文档同时被返回了。
接下来,对z字段建立一个稀疏索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_80_4.jpg?sign=1738855182-x2QMWr4jhe3Y6FN1Djx5YuEQAUltuM2J-0-5c96fc3a955cb2ac8164df4ca935267b)
使用建立的稀疏索引进行查询,会发现只有包含z字段(值为null)的文档被返回了,结果如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_1.jpg?sign=1738855182-PcSbph4SvXwrij9GRD7TedXjza528mh2-0-b54a9b8c58d1618bb0430a9ef48a158c)
4.7.3 文本索引
MongoDB支持全文检索功能,可通过建立文本索引来实现简易的分词检索。
预置数据如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_2.jpg?sign=1738855182-5mAEuM3bG9b5kxnCtSerbwMhMukRwvJz-0-7b20f395dc8aec236f4eb812d57a3811)
创建文本索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_3.jpg?sign=1738855182-pSd32jSMGO9HloO5DcC0UCWX5l8XdO7u-0-6482ece265e0298eafee0bdb0276093d)
这里为stories集合创建了一个文本索引,该索引同时包含对title、summary字段的分词检索。
使用$text操作符进行文本搜索,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_81_4.jpg?sign=1738855182-XSko8BX7PNKMb4ryVSGTGjuczbHY0OxC-0-a116f3f4c3fce3bc78194d7c4e542466)
$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=1738855182-YF7Vltw4YZymj1J6vpuvryAuc6eGFNnP-0-67473fe23aa7abaaf6dfb7548439a4bd)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_1.jpg?sign=1738855182-1Z0rHB76LpiFL0BDOZi1YUt8QEonmyKF-0-397f1dabc2d54366eda2990b5436ebe8)
其中,attributes作为嵌套文档存放了商品的多个属性,而不同商品所具有的属性很可能是不一样的。
接下来创建一个模糊索引,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_2.jpg?sign=1738855182-6arOsxanOWBIz7mynfTNs1EJx9iLUdW3-0-584130fb2eb0b4c9bf2464ff026ca236)
attributes.$**表示该索引将匹配以attributes字段作为开始路径的任何一个字段。
这个索引可以匹配下面的任意一种查询:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_82_3.jpg?sign=1738855182-8MUHqAfQMdDUxT665ntWhMCrPZMbRsKS-0-dd8dc52963b245112bc306bf2d194aec)