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 }