

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 复合索引
<a name="indexes-compound"></a>

复合索引存储来自文档集合中两个或多个字段的信息，允许对第一个字段或任何前缀字段进行查询。这些索引可优化同时筛选多个字段或将筛选与排序操作相结合的查询的性能。它们对最左边的索引字段的单条件查询也很有效。数据库利用这些索引条目来高效地找到匹配的文档，而无需执行完整的馆藏扫描。

复合字段索引在以下情况下很有用：
+ 您需要同时筛选多个字段。
+ 您需要将筛选与排序操作相结合。

## 支持的索引属性
<a name="indexes-compound-properties"></a>


| Option | 3.6 | 4.0 | 5.0 | 8.0 | 弹性集群 | 
| --- | --- | --- | --- | --- | --- | 
| [name](index-property-name.md) | 支持 | 是 | 是 | 是 | 是 | 
| [独特](index-property-unique.md) | 支持 | 是 | 是 | 是 | 是 | 
| [稀疏\*](index-property-sparse.md) | 支持 | 是 | 是 | 是 | 是 | 
| [部分 FilterExpression](index-property-partialfilterexpression.md) \* | 否 | 否 | 是 | 是 | 否 | 

\* `sparse` 和`partialFilterExpression`选项不能在同一个索引定义中一起使用。如果您尝试使用这些选项创建索引，它将失败并显示以下错误：

```
Error in specification: cannot mix partialFilterExpression and sparse options
```

## 创建复合索引
<a name="indexes-compound-creating"></a>

使用`createIndex()`方法创建复合索引。该方法的语法是：`db.collection.createIndex(<keys>, <options>)`

`keys`参数是一个 JSON 文档，用于指定字段和索引排序顺序：

```
{
  "<field 1>": <1 (ascending)|-1 (descending)>,
  "<field 2>": <1 (ascending)|-1 (descending)>,
  ...
}
```

请注意，复合索引中只有一个字段可以是数组。如果您尝试在两个或多个数组字段上创建复合索引，它将失败并显示以下错误：

```
multiple fields of compound index cannot be arrays
```

`options`参数是一个 JSON 文档，用于指定索引的选项：

```
{
  "name": "<name>",
  "unique": <true | false>,
  "sparse": <true | false>,
  "partialFilterExpression": <filter expression>
}
```

有关创建复合[索引的示例，请参阅索引属性](index-properties.md)。