Docs 菜单
Docs 主页
/ / /
Rust 驱动程序
/

索引

在此页面上

  • Overview
  • 查询覆盖和性能
  • 操作注意事项
  • 索引类型
  • 单字段索引
  • 复合索引
  • 多键索引(数组字段索引)
  • 聚集索引
  • Text Indexes
  • 地理空间索引
  • Unique Indexes
  • 删除索引
  • 更多信息
  • API 文档

在本指南中,您可以了解如何使用 Rust 驱动程序创建和管理索引。索引是 MongoDB 中用于提高查询性能的特殊数据结构。

如果在没有任何索引的集合上执行查询,MongoDB 会扫描每个文档以查找匹配项。这些集合扫描很慢,可能会对应用程序的性能产生负面影响。当您创建涵盖查询的索引时,MongoDB 会限制其检查以查找匹配项的文档数量,从而提高性能。

提示

您可以在更新操作、删除操作和某些聚合管道阶段使用索引。 要了解有关在聚合中使用索引的更多信息,请参阅 MongoDB Server手册中的 使用索引和文档筛选器提高性能 。

下表描述了可以包含在 MongoDB 查询中的元素:

元素
说明
查询
Required
Specifies the fields and values to match
选项
Optional
Specify how the query executes
投射
Optional
Specifies the fields that MongoDB returns in matched documents
Sort
Optional
Specifies the order of documents returned

当查询元素引用全部包含在同一索引中的字段时,MongoDB 可以直接从索引返回结果。 这些查询称为覆盖查询

要学习;了解如何确保索引覆盖查询,请参阅服务器手册中的覆盖查询

重要

排序条件

您的排序条件必须与索引的顺序一致或相反。

假设一个collection在 上具有以下索引,name 字段按升序 (AZ) 排列,age 字段按降序排列 (9-0):

name_1_age_-1

当您采用以下任一配置对文档进行排序时,MongoDB 会使用此索引:

  • name 升序, age降序

  • name 降序,age 升序

如果为两个字段指定相同的排序顺序,则 MongoDB 不使用索引,而是执行内存中排序。

要提高查询性能,请为查询中经常出现的字段创建索引。 但是,追踪索引内存和磁盘使用情况以进行容量规划是一个好习惯,因为每个索引都会消耗磁盘空间和内存。此外,如果写入操作更新了索引字段,MongoDB 还必须更新相关索引。

MongoDB 支持动态模式,因此您的应用程序可以查询具有未知名称或变量名称的字段。 如果您连接到 MongoDB Server 4.2或更高版本,则可以创建通配符索引来支持这些查询。 要了解有关此索引类型的更多信息,请参阅 MongoDB Server手册中的 通配符索引 。

MongoDB 支持多种索引类型来支持您的查询。 以下部分介绍了常见的索引类型,并展示了如何在集合中创建每种索引类型。

注意

样本集合

本指南中的示例使用 Atlas 样本数据中的集合。 要了解如何导入此数据,请参阅 Atlas 文档中的“加载样本数据”教程。

您可以使用create_index()create_indexes()方法在collection中创建索引。create_index()方法接受一个IndexModel结构体参数,您可以使用该类型的builder()方法来构造该参数。

要查看索引类型的完整列表,请参阅 MongoDB Server手册中的 索引类型 。

单个字段索引包含对文档字段的引用。

该索引提高了单字段查询和排序的性能。 它还支持TTL索引,可在一定时间后自动从集合删除文档。 要学习;了解有关TTL索引的更多信息,请参阅服务器手册中的TTL索引

当您创建新集合时,MongoDB 会自动在_id字段上创建唯一的单字段索引。

以下代码在sample_training.zips collection中的city字段上创建一个升序索引:

let index = IndexModel::builder().keys(doc! { "city": 1 }).build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
city_1

复合索引包含对多个文档字段的引用。

该索引提高了对多个字段进行查询和排序的性能。 创建复合索引时,必须为每个索引字段指定一个方向。

您可以使用与创建单字段索引相同的语法来创建多键索引。

以下代码在sample_training.zips collection 中的citypop 字段 上创建复合索引:

let index = IndexModel::builder()
.keys(doc! { "city": 1, "pop": -1 })
.build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
city_1_pop_-1

多键索引包含对数组值字段的引用。此索引提高了对数组字段的查询性能。

您可以使用与创建单字段索引相同的语法来创建多键索引。

tagssample_training.posts以下代码在collection中的 字段上创建多键索引:

let index = IndexModel::builder().keys(doc! { "tags": 1 }).build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
tags_1

聚集索引可提高对聚集集合的插入、更新和删除操作的性能。聚集集合按聚集索引键值的顺序存储文档。要了解有关这些集合的更多信息,请参阅服务器手册中的聚集集合

只有在创建collection时才能创建集群化索引。要创建集群化集合,请执行以下步骤:

  1. 创建一个ClusteredIndex实例。

  2. 调用create_collection()方法。

  3. clustered_index()方法链接到create_collection()方法,将ClusteredIndex实例作为clustered_index()的参数传递。

您必须设置ClusteredIndex结构的以下字段:

  • key字段,用于指定密钥模式。此字段的值必须是{ _id: 1 }

  • unique字段,指定索引的唯一性。 此字段的值必须是true

ClusteredIndex要创建自动使用所需值的实例,您可以调用该类型的default() 方法。

以下代码在数据库sample_training中创建名为collectionitems的新集合时,在字段_id上创建具有默认配置的集群索引:

let db = client.database("sample_training");
let cl_idx = ClusteredIndex::default();
db.create_collection("items")
.clustered_index(cl_idx)
.await?;

文本索引支持对字符串内容进行文本搜索查询。 该索引引用具有字符串值或字符串数组值的字段。MongoDB 支持多种语言的文本搜索。 创建文本索引时,可以指定默认语言作为选项。

一个集合只能包含一个文本索引。 要在多个文本字段上创建文本索引,可以创建复合索引。 在创建复合索引后运行文本Atlas Search时, Atlas Search操作将对复合索引中的所有文本字段运行。

提示

Atlas 全文搜索

文本索引与Atlas Full Text Search索引不同。 要学习;了解有关Atlas Search索引的更多信息,请参阅 Atlas Search索引指南。

bodysample_training.posts以下代码在collection集合中的字段字段上创建文本索引。该代码设置一个选项以将"spanish"指定为文本索引的默认语言:

let idx_opts = IndexOptions::builder()
.default_language("spanish".to_string())
.build();
let index = IndexModel::builder()
.keys(doc! { "body": "text" })
.options(idx_opts)
.build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
body_"text"

MongoDB 通过使用2dsphere索引支持包含地理空间坐标数据的查询。 您可以使用 GeoJSON 对象值在字段上创建2dsphere索引。

此索引类型支持以下任务:

  • 查询地理空间数据以查找包含项、交集和邻近范围

  • 欧几里得平面上的距离计算

重要

不能对同一字段创建两个地理空间索引。

sample_mflix.theaters集合中的以下示例文档包含字段location.geo 。 该字段具有 GeoJSON point 值:

{
"_id": ...,
"theaterId": ...,
"location": {
"address": ...,
"geo": {
"type": "Point",
"coordinates": [
-93.24565,
44.85466
]
}
}
}

以下代码在collection中的字段 上创建地理空间2dsphere 索引:location.geosample_mflix.theaters

let index = IndexModel::builder()
.keys(doc! { "location.geo": "2dsphere" })
.build();
let idx = my_coll.create_index(index).await?;
println!("Created index:\n{}", idx.index_name);
Created index:
location.geo_"2dsphere"

唯一索引可确保索引字段不存储重复值。 默认,当您创建collection时,MongoDB 会在_id字段上创建唯一的单字段索引。

要创建唯一索引,请指定要保持唯一性的字段或字段组合,并将 unique 选项设置为 true

以下代码演示如何在IndexOptions实例中将unique字段设置为true ,并在创建IndexModel时传递这些选项:

let opts = IndexOptions::builder().unique(true).build();
let index = IndexModel::builder()
.keys(doc! { "_id": -1 })
.options(opts)
.build();

您可以删除collection中除_id字段上的默认唯一索引之外的任何索引。要删除索引,请将索引的名称传递给drop_index()方法。

提示

删除所有索引

您可以使用drop_indexes()方法一次性删除collection上除_id索引之外的所有索引。

city_1sample_training.zips以下示例从collection中删除名为 的索引:

my_coll.drop_index("city_1".to_string()).await?;

要了解有关设计数据模型和为应用程序创建适当索引的更多信息,请参阅 MongoDB Server手册中的 索引策略 和 操作因素和数据模型 。

要了解如何执行读取操作,请参阅读取操作类别中的指南。

要了解有关本指南中提到的概念的更多信息,请参阅以下服务器文档:

要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档:

后退

聚合(Aggregation)