Docs Menu
Docs Home
/ / /
Go Driver
/

Indexes

項目一覧

  • Overview
  • クエリ範囲とパフォーマンス
  • 操作上の考慮事項
  • インデックス タイプ
  • 単一フィールド インデックス
  • 複合インデックス
  • マルチキー インデックス(配列フィールドへのインデックス)
  • クラスター化インデックス
  • Text Indexes
  • 地理空間インデックス
  • Unique Indexes
  • インデックスを削除する
  • 詳細情報
  • API ドキュメント

このガイドでは、MongoDB Go ドライバーでインデックスを使用する方法を学習できます。

インデックスは、MongoDB でクエリを効率的に実行するのに役立ちます。 インデックスがないと、MongoDB はコレクション内のすべてのドキュメントをスキャン(コレクションスキャン)して、クエリに一致するドキュメントを見つけます。 コレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 適切なインデックスを使用すると、MongoDB は検査するドキュメントの数を制限します。

Tip

また、更新操作、削除操作、および特定の集計パイプライン ステージではインデックスを使用できます。

MongoDB のクエリには次の要素を含めることができます。

要素
必要性
目的
クエリ
必須
検索するフィールドと値を指定します。
オプション
任意
クエリの実行方法を指定します。
プロジェクション
任意
MongoDB で返されるフィールドを指定します。
Sort
任意
MongoDB がドキュメントを返す順序を指定します。

これらの要素を同じインデックスで指定すると、MongoDB はインデックスから直接結果を返します。これはカバード クエリとも呼ばれます。

重要

ソート条件

ソート条件は、インデックスの順序と一致するか、その順序を逆にする必要があります。

name昇順(AZ)でフィールドage と降順(9-0)のフィールド のインデックスを検討します。

name_1_age_-1

MongoDB は、データを次のいずれかでソートするときにこのインデックスを使用します。

  • name 昇順、 age降順

  • name 降順、 ageの昇順

name ageの昇順、またはnameageの降順の並べ替え順序を指定するには、メモリ内でソートする必要があります。

インデックスがクエリ条件とプロジェクションをカバーするようにする方法については、「クエリ カバレッジ 」を参照してください。

クエリのパフォーマンスを向上させるには、ソートされた結果を返すクエリや操作で頻繁に表示されるフィールドにインデックスを作成します。 追加する各インデックスはディスク領域とメモリを消費するため、キャパシティー プランニングのためにインデックス メモリとディスク使用量を追跡します。 さらに、書込み操作によってインデックス フィールドが更新される場合、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)

複合インデックスは、コレクションのドキュメント内の複数のフィールドへの参照を保持します。 このインデックスにより、クエリとソートのパフォーマンスが向上します。

次の例では、fullplot titlesample_mflix.moviesコレクションの フィールドと フィールドに複合インデックスを作成しています。

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)

マルチキー インデックスは、単一フィールド インデックスおよび複合インデックスと同じ構文を使用します。 このインデックスにより、配列フィールドをインデックスとして指定するクエリのパフォーマンスが向上します。

次の例では、 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)

クラスター化されたインデックスを使用すると、クラスター化されたコレクションに対する挿入、アップデート、削除操作のパフォーマンスが向上します。 クラスター化されたコレクションには、クラスター化されたインデックスのキー値順にドキュメントが保存されます。

クラスター化インデックスを作成するには、コレクションを作成するときに、 _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)

テキスト インデックス は、string コンテンツに対するテキスト検索クエリをサポートします。 このインデックスには string フィールドまたは string の配列が必要です。 MongoDB は、複数の言語のテキスト検索をサポートしています。 インデックスの作成時に、オプションとしてデフォルト言語を指定できます。

コレクションには 1 つのテキスト インデックスしか含めることができません。 複数のテキストフィールドのテキストインデックスを作成する場合は、複合インデックスを作成する必要があります。 テキスト検索は、複合インデックス内のすべてのテキスト フィールドに対して実行されます。

Tip

テキスト インデックスは、より強力なAtlas Full Text Searchインデックスとは異なります。 Atlas ユーザーには Atlas Search を推奨します。

次の例では、 plotフィールドに、 sample_mflix.moviesコレクション内のデフォルト言語として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)

MongoDB は、 2dsphere インデックスを使用することで、地理空間座標データを含むクエリをサポートします。 2dsphereインデックスは GeoJSON オブジェクト フィールド内になければなりません。

このインデックスを使用すると、次の操作を実行できます。

  • 包含、交差、近接性について地理空間データをクエリします。

  • ユークリッド平面上の距離の計算と、MongoDB 2.2 以前で使用される "legacy coordinate pairs" 構文を操作するための 。

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)

ユニークインデックスにより、インデックス フィールドに重複する値が格納されなくなります。デフォルトでは、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)

_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)

記載されているインデックスの詳細については、次のガイドを参照してください。

上記で説明されている操作の詳細については、次のガイドを参照してください。

  • クエリを指定する

  • ドキュメントの変更

  • Delete Documents

このガイドで説明されているメソッドの詳細については、次の API ドキュメントを参照してください。

戻る

集計