MongoDB支持复合索引,其中单个索引结构包含对 集合文档中多个字段[1]的引用。下图说明了两个字段上的复合索引的示例:
| [1] | MongoDB施加一个。limit of 32 fields for any compound index |
复合索引可以支持在多个字段上匹配的查询。
要创建复合索引,请使用类似于以下原型的操作:
索引规范中该字段的值描述了该字段的索引类型。例如,值1表示以升序对项目进行排序的索引。值-1指定一个索引,该索引按降序对项目进行排序。有关其他索引类型,请参见索引类型。
重要
您不能创建具有hashed索引类型的复合索引
。如果尝试创建包含哈希索引字段的复合索引,则会收到错误消息。
考虑一个名为的集合products,其中包含类似于以下文档的文档:
以下操作在item和
stock字段上创建一个升序索引:
复合索引中列出的字段的顺序很重要。索引将包含对文档的引用,这些文档首先按item字段的值排序,然后在该字段的每个值内item,按库存字段的值排序。有关
更多信息,请参见排序顺序。
除了支持在所有索引字段上都匹配的查询之外,复合索引还可以支持在索引字段的前缀上匹配的查询。也就是说,索引支持对item字段以及item和stock字段的查询:
有关详细信息,请参见前缀。
索引以升序(1)或降序(-1)排序顺序存储对字段的引用。对于单字段索引,键的排序顺序无关紧要,因为MongoDB可以在任一方向上遍历索引。但是,对于复合索引,排序顺序可能会决定索引是否可以支持排序操作。
考虑一个集合events,包含与域的文档username和date。应用程序可以发出查询,这些查询返回的结果首先是按升序排序username,然后按降序(即从最新到最后)排序date,例如:
或返回返回结果的查询,这些结果首先按降序排序username
,然后按升序排序date,例如:
以下索引可以支持这两种排序操作:
但是,上面的索引不能支持按升序username然后按升序排序
date,例如:
有关排序顺序和复合索引的更多信息,请参见 使用索引对查询结果进行排序。
索引前缀是索引字段的开始子集。例如,考虑以下复合索引:
索引具有以下索引前缀:
{ item: 1 }{ item: 1, location: 1 }对于复合索引,MongoDB可以使用索引来支持对索引前缀的查询。这样,MongoDB可以将索引用于以下字段的查询:
item现场,item现场,并在location现场,item现场,并在location现场和在stock现场。MongoDB还可以使用索引来支持对item和
stock字段的查询,因为item字段对应于前缀。但是,索引在支持查询方面的效率不如仅item和上的索引有效stock。
但是,MongoDB无法使用索引来支持包含以下字段的查询,因为如果没有该item字段,则列出的任何字段都不对应于前缀索引:
location现场,stock现场,或location和stock领域。如果您的集合同时具有复合索引和其前缀的索引(例如和),则如果两个索引都没有稀疏或唯一约束,则可以删除前缀的索引(例如)。MongoDB在所有使用前缀索引的情况下都将使用复合索引。{ a: 1, b: 1 }{ a: 1 }{ a: 1 }