Docs Menu
Docs Home
/ / /
Rust ドライバー
/

Indexes

項目一覧

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

このガイドでは、Rust ドライバーを使用してインデックスを作成および管理する方法を説明します。 インデックスは、MongoDB のクエリ パフォーマンスを向上させる特別なデータ構造です。

インデックスなしのコレクションに対して クエリを実行すると、MongoDB はすべてのドキュメントをスキャンして一致を見つけます。 これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 クエリを カバー するインデックスを作成すると、MongoDB は一致を見つけるために検査するドキュメントの数を制限し、パフォーマンスを向上させます。

Tip

インデックスは、更新操作、削除操作、および一部の集計パイプライン ステージで使用できます。 集計でインデックスを使用する方法の詳細については、サーバー マニュアルの「 インデックスとドキュメント フィルターによるパフォーマンスの向上」を参照してください。

次の表では、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 はインデックスから直接結果を返すことができます。 このようなクエリは、カバード クエリと呼ばれます。

インデックスがクエリをカバーするようにする方法については、サーバー マニュアルの「カバーされたクエリ 」を参照してください。

重要

ソート条件

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

コレクションに、昇順(AZ)の nameフィールドと降順(9-0)のageフィールドに次のインデックスがあるとします。

name_1_age_-1

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

  • name 昇順、 age降順

  • name 降順、 ageの昇順

両方のフィールドに同じソート順序を指定すると、MongoDB はインデックスを使用せず、代わりにメモリ内ソートを実行します。

クエリのパフォーマンスを向上させるには、クエリで頻繁に表示されるフィールドにインデックスを作成します。 ただし、各インデックスはディスク領域とメモリを消費するため、キャパシティー プランニングとしてインデックス メモリとディスク使用量を追跡することをお勧めします。 さらに、書込み操作によってインデックス フィールドが更新される場合、MongoDB は関連するインデックスも更新する必要があります。

MongoDB は動的スキーマをサポートしているため、アプリケーションは不明な名前や変数名を持つフィールドに対してクエリを実行できます。 MongoDB Server バージョン4.2以降に接続している場合は、これらのクエリをサポートするワイルドカード インデックスを作成できます。 このインデックス タイプの詳細については、サーバー マニュアルの「ワイルドカード インデックス」を参照してください。

MongoDB は、クエリをサポートするための 複数のインデックス タイプ をサポートしています。 以下のセクションでは、一般的なインデックス型について説明し、コレクション内に各インデックス型を作成する方法を示します。

注意

サンプル コレクション

このガイドの例では、Atlas サンプル データのコレクションを使用します。 このデータをインポートする方法については、Atlas ドキュメントの「サンプル データのロード」チュートリアルを参照してください。

コレクションにインデックスを作成するには、 create_index()メソッドとcreate_indexes()メソッドを使用します。 create_index()メソッドはIndexModel構造体パラメータを受け取ります。このパラメータは型のbuilder()メソッドを使用して構築できます。

インデックス タイプの完全なリストを表示するには、サーバー マニュアルの「インデックス タイプ 」を参照してください。

単一フィールド インデックスはドキュメント フィールドへの参照を保持します。

このインデックスにより、単一フィールドのクエリとソートのパフォーマンスが向上します。 また、一定時間後にコレクションからドキュメントを自動的に削除する TTL インデックスもサポートしています。 TTL インデックスの詳細については、サーバー マニュアルの「 TTL インデックス」を参照してください。

新しいコレクションを作成すると、MongoDB は_idフィールドに一意の 単一フィールド インデックスを自動的に作成します。

次のコードを使用することで、 sample_training.zipsコレクションの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

複合インデックスには複数のドキュメント フィールドへの参照が保持されます。

このインデックスにより、複数のフィールドに対するクエリとソートのパフォーマンスが向上します。 複合インデックスを作成するときは、各インデックス フィールドの方向を指定する必要があります。

単一フィールド インデックスの作成と同じ構文を使用して、マルチキー インデックスを作成できます。

次のコードを使用することで、city popsample_training.zipsコレクションの フィールドと フィールドに複合インデックスが作成されます。

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

マルチキー インデックスは、配列値のあるフィールドへの参照を保持します。 このインデックスにより、配列フィールドに対するクエリのパフォーマンスが向上します。

単一フィールド インデックスの作成と同じ構文を使用して、マルチキー インデックスを作成できます。

次のコードを使用することで、 sample_training.postsコレクションのtagsフィールドにマルチキー インデックスが作成されます。

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

クラスター化されたインデックスを使用すると、クラスター化されたコレクションに対する挿入、アップデート、削除操作のパフォーマンスが向上します。 クラスター化されたコレクションには、クラスター化されたインデックスのキー値順にドキュメントが保存されます。 これらのコレクションの詳細については、サーバー マニュアルの「クラスター化されたコレクション 」を参照してください。

クラスター化インデックスは、コレクションを作成するときにのみ作成できます。 クラスター化されたコレクションを作成するには、次の手順を実行します。

  1. ClusteredIndexインスタンスを作成します。

  2. create_collection()メソッドを呼び出します。

  3. clustered_index()メソッドをcreate_collection()メソッドにチェーンして、 ClusteredIndexインスタンスをclustered_index()のパラメーターとして渡します。

ClusteredIndex構造体の次のフィールドを設定する必要があります。

  • キー パターンを指定するkeyフィールド。 このフィールドの値は{ _id: 1 }である必要があります。

  • インデックスの一意性を指定するuniqueフィールド。 このフィールドの値はtrueである必要があります。

必要な値を自動的に使用するClusteredIndexインスタンスを作成するには、タイプのdefault()メソッドを呼び出します。

次のコードを使用することで、 sample_trainingデータベースにitemsという新しいコレクションを作成する際に、 _idフィールドにデフォルト構成のクラスター化インデックスが作成されます。

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

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

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

Tip

Atlas Full Text Search

テキスト インデックスはAtlas Full Text Searchインデックス とは異なります。 To learn more about Atlas Search indexes, see the Atlas Search Indexes guide.

次のコードを使用すると、 sample_training.postsコレクションのbodyフィールドにテキスト インデックスが作成されます。 このコードでは、テキスト インデックスのデフォルト言語として"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インデックスを作成できます。

このインデックス タイプは、次のタスクをサポートします。

  • 地理空間データをクエリして、包含、交差、近接性を見つける

  • ユークリッド平面上の距離の計算

重要

同じフィールドに 2 つの地理空間インデックスを作成することはできません。

sample_mflix.theatersコレクション内の次のサンプル ドキュメントには、フィールドlocation.geoが含まれています。 このフィールドには GeoJSON ポイント値があります。

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

次のコードを使用することで、 sample_mflix.theatersコレクションのlocation.geoフィールドに地理空間2dsphereインデックスが作成されます。

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"

一意のインデックス により、インデックス フィールドに重複する値が保存されなくなります。 デフォルトでは、コレクションを作成すると、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();

_idフィールドのデフォルトの一意なインデックスを除くすべてのインデックスをコレクションから削除または削除できます。 インデックスを削除するには、インデックスの名前をdrop_index()メソッドに渡します。

Tip

すべてのインデックスを削除する

drop_indexes()メソッドを使用して、 _idインデックスを除くコレクションのすべてのインデックスを一度に削除できます。

次の例では、 sample_training.zipsコレクションからcity_1というインデックスを削除します。

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

データモデルの設計とアプリケーションに適したインデックスの作成の詳細については、サーバー マニュアルの「インデックス作成戦略」と「 運用上の要因とデータモデル」を参照してください。

読み取り操作の実行の詳細については、「読み取り操作」カテゴリのガイドを参照してください。

このガイドで言及されている概念の詳細については、次のサーバー ドキュメントを参照してください。

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

戻る

集計