
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
4.3 数组索引
数组索引也被称为多值索引(multikey index),当我们对数组型的字段创建索引时,这个索引就是多值的。
根据前面的文档模型,可以按如下场景建立索引:

由于标签是一个数组字段,因此这个索引自然就是多值索引。多值索引在使用上与普通索引并没有什么不同,只是在索引键上会同时产生多个值,比如下面的文档:

按标签建立索引后,将会产生如下的索引结构:

数组索引必然会使索引的条目和体积发生膨胀。比如,一个book文档中存在20个标签,那么就会产生20个索引条目,这些条目同时指向同一个文档。为了避免失控,有必要在文档的设计上做出一些限制。
复合的多值索引
多值索引很容易与复合索引产生混淆,复合索引是多个字段的组合,而多值索引则仅仅是在一个字段上出现了多值(multi key)。而实质上,多值索引也可以出现在复合字段上,代码如下:

然而,MongoDB并不支持一个复合索引中同时出现多个数组字段,比如下面的定义是不被允许的:

这里假设了versions也是一个数组字段。