![MongoDB进阶与实战:微服务整合、性能优化、架构管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/38209697/b_38209697.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.3 数组索引
数组索引也被称为多值索引(multikey index),当我们对数组型的字段创建索引时,这个索引就是多值的。
根据前面的文档模型,可以按如下场景建立索引:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_73_3.jpg?sign=1738797574-IamVf3kiaRp8yKFDXosHAuVW177Zrqq8-0-6d82db2cae65e000532b131821769741)
由于标签是一个数组字段,因此这个索引自然就是多值索引。多值索引在使用上与普通索引并没有什么不同,只是在索引键上会同时产生多个值,比如下面的文档:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_73_4.jpg?sign=1738797574-PTT2aWzJkmZNkCZ9Md6AgS7lACGdlpqU-0-c8a7d538afdc8228c0808e740c839757)
按标签建立索引后,将会产生如下的索引结构:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_73_5.jpg?sign=1738797574-tv8xS9vjf4sFobR4UeJW8QQB3roqPXWZ-0-5e48b26f2b031b61a4e820e0f7dfa77e)
数组索引必然会使索引的条目和体积发生膨胀。比如,一个book文档中存在20个标签,那么就会产生20个索引条目,这些条目同时指向同一个文档。为了避免失控,有必要在文档的设计上做出一些限制。
复合的多值索引
多值索引很容易与复合索引产生混淆,复合索引是多个字段的组合,而多值索引则仅仅是在一个字段上出现了多值(multi key)。而实质上,多值索引也可以出现在复合字段上,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_74_1.jpg?sign=1738797574-2dt0Z4U9dgflWoTNn2hPrAymp60yclj5-0-f168ef1ac715bc0863422474b3567757)
然而,MongoDB并不支持一个复合索引中同时出现多个数组字段,比如下面的定义是不被允许的:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_74_2.jpg?sign=1738797574-IGWLbD2OR8hCtemJjC2A9KovFRxzcvf0-0-8e9479a6f7cc13e53ce92cc17cfe8290)
这里假设了versions也是一个数组字段。