文档菜单
文档首页
/ / /
Go 驱动
/

索引

在本页

  • 概述
  • 查询覆盖率和性能
  • 操作注意事项
  • 索引类型
  • 单字段索引
  • 组合索引
  • 多键索引(数组字段上的索引)
  • 聚集索引
  • 文本索引
  • 地理空间索引
  • 唯一索引
  • 移除索引
  • 附加信息
  • API 文档

在本指南中,您可以了解如何在MongoDB Go驱动程序中使用索引

索引支持MongoDB中查询的高效执行。没有索引,MongoDB会扫描集合中的每个文档(一个集合扫描)以找到匹配您的查询的文档。集合扫描速度慢,可能会影响您的应用程序的性能。使用适当的索引,MongoDB会限制它检查的文档数量。

提示

您还可以在更新操作、删除操作和某些聚合管道阶段中使用索引.

MongoDB中的查询可以包含以下元素

元素
必要性
目的
查询
必需
指定您要查找的字段和值。
选项
可选
指定查询如何执行。
投影
可选
指定MongoDB返回的字段。
排序
可选
指定MongoDB返回文档的顺序。

当您在同一个索引中指定这些元素时,MongoDB直接从索引返回结果,也称为覆盖查询

重要

排序标准

您的排序标准必须与索引的顺序匹配或反转。

考虑对字段name按升序(A-Z)和age按降序(9-0)建立的索引

name_1_age_-1

MongoDB会在您按以下方式排序数据时使用此索引

  • name升序,age降序

  • name降序,age升序

指定排序顺序为name年龄 升序或 姓名年龄 降序排序需要内存排序。

要了解如何确保索引覆盖查询条件和投影,请参阅查询覆盖。

为了提高查询性能,请在常出现在查询和返回排序结果的操作中创建索引字段。跟踪索引内存和磁盘使用情况以进行容量规划,因为每个添加的索引都会消耗磁盘空间和内存。此外,当写操作更新索引字段时,MongoDB 还必须更新相关的索引。

由于 MongoDB 支持动态模式,因此您的应用程序可以查询未知或任意名称的字段。MongoDB 4.2 引入了通配索引来帮助支持这些查询。通配索引不是用来代替基于工作负载的索引规划的。

要了解更多关于设计数据模型和选择适合您应用程序的索引的信息,请参阅索引策略数据建模和索引

MongoDB 支持多种索引类型以支持查询数据。以下部分描述并展示了如何创建最常见的索引类型。要查看索引类型的完整列表,请参阅索引。

单字段索引包含对集合文档中字段的引用。

此索引提高了单字段查询和排序性能,并支持TTL索引,该索引会在一定时间后自动从集合中删除文档。

注意

_id索引是单字段索引的一个例子。创建新集合时,将在_id字段上自动创建此索引。

以下示例在sample_mflix.movies集合的title字段上创建一个升序索引

coll := client.Database("sample_mflix").Collection("movies")
indexModel := mongo.IndexModel{
Keys: bson.D{{"title", 1}},
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: title_1

组合索引包含对集合文档中多个字段的引用。此索引提高了查询和排序性能。

以下示例在sample_mflix.movies集合的fullplottitle字段上创建一个复合索引

coll := client.Database("sample_mflix").Collection("movies")
indexModel := mongo.IndexModel{
Keys: bson.D{
{"fullplot", -1},
{"title", 1}
}
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: fullplot_-1_title_1

多键索引与单字段索引和复合索引使用相同的语法。此索引可以提高指定数组字段作为索引的查询性能。

以下示例在sample_mflix.movies集合的cast字段上创建一个多键索引

coll := client.Database("sample_mflix").Collection("movies")
indexModel := mongo.IndexModel{
Keys: bson.D{{"cast", -1}}
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: cast_-1

聚集索引可以提高在聚集集合上执行插入、更新和删除操作的性能。聚集集合按聚集索引键值存储文档。

要创建聚集索引,在创建集合时,使用_id字段作为键,并将唯一字段指定为true

以下示例在db.tea集合的_id字段上创建聚集索引

db := client.Database("db")
cio := bson.D{{"key", bson.D{{"_id", 1}}}, {"unique", true}}
opts := options.CreateCollection().SetClusteredIndex(cio)
db.CreateCollection(context.TODO(), "tea", opts)

文本索引支持对字符串内容的文本搜索查询。此索引需要一个字符串字段或字符串数组。MongoDB支持多种语言的文本搜索。您可以在创建索引时指定默认语言作为选项。

集合只能包含一个文本索引。如果想要为多个文本字段创建文本索引,必须创建一个组合索引。文本搜索将在组合索引内的所有文本字段上运行。

提示

文本索引与更强大的Atlas全文搜索索引不同。我们建议Atlas用户使用Atlas搜索。

以下示例在sample_mflix.movies集合中的plot字段上创建了一个文本索引,默认语言为italian

coll := client.Database("sample_mflix").Collection("movies")
indexModel := mongo.IndexModel{Keys: bson.D{{"plot", "text"}, {"default_language", "italian"}}}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: plot_text

MongoDB通过使用2dsphere索引支持包含地理空间坐标数据的查询。一个2dsphere索引必须在GeoJSON对象字段中。

此索引允许您执行以下操作

  • 查询地理空间数据以包含、相交和邻近。

  • 在欧几里得平面上计算距离以及处理MongoDB 2.2和更早版本中使用的“旧坐标对”语法。

sample_mflix.theaters集合中一个文档的location.geo字段是一个描述影院坐标的GeoJSON点对象

{
"_id" : ObjectId("59a47286cfa9a3a73e51e75c"),
"theaterId" : 104,
"location" : {
"address" : {
"street1" : "5000 W 147th St",
"city" : "Hawthorne",
"state" : "CA",
"zipcode" : "90250"
},
"geo" : {
"type" : "Point",
"coordinates" : [
-118.36559,
33.897167
]
}
}
}

以下示例在location.geo字段上创建了一个2dsphere索引

重要

尝试在已由地理空间索引覆盖的字段上创建地理空间索引将导致错误。

indexModel := mongo.IndexModel{
Keys: bson.D{{"location.geo", "2dsphere"}}
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
location.geo_2dsphere

唯一索引确保索引字段不存储重复值。默认情况下,MongoDB在创建集合时在_id字段上创建唯一索引。

要创建唯一索引,指定要防止重复的字段或字段组合,并将_unique选项设置为true。

以下示例在theaterId字段上创建一个唯一的降序索引

indexModel := mongo.IndexModel{
Keys: bson.D{{"theaterId", -1}},
Options: options.Index().SetUnique(true),
}
name, err := coll.Indexes().CreateOne(context.TODO(), indexModel)
if err != nil {
panic(err)
}
fmt.Println("Name of Index Created: " + name)
Name of Index Created: theaterId_-1

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

以下示例从sample_mflix.movies集合中删除了title字段的升序索引

coll := client.Database("sample_mflix").Collection("movies")
res, err := coll.Indexes().DropOne(context.TODO(), "title_1")
if err != nil {
panic(err)
}
fmt.Println(res)
{"nIndexesWas": {"$numberInt":"2"}}

要了解更多关于提到的索引,请参阅以下指南

要了解更多关于提到的操作,请参阅以下指南

  • 指定查询

  • 修改文档

  • 删除文档

要了解更多关于本指南中讨论的任何方法,请参阅以下 API 文档

返回

聚合