Docs Menu
Docs Home
/ /

Indexes

このガイドでは、 Cドライバーでインデックスを使用する方法を学習できます。インデックスはクエリの効率を向上させ、ドキュメントのクエリと保存に機能を追加します。

インデックスがないと、MongoDB はコレクション内のすべてのドキュメントをスキャンして 、各クエリに一致するドキュメントを見つける必要があります。 これらのコレクションスキャンは遅く、アプリケーションのパフォーマンスに悪影響を与える可能性があります。 ただし、クエリに適切なインデックスがある場合、MongoDB はそのインデックスを使用して検査する必要があるドキュメントを制限できます。

クエリのパフォーマンスを向上させるには、ソートされた結果を返すアプリケーションのクエリや操作で頻繁に表示されるフィールドにインデックスをビルドします。 追加する各インデックスはアクティブな場合にディスク領域とメモリを消費するため、キャパシティー プランニングとしてインデックス メモリとディスク使用量を追跡することをお勧めします。 さらに、書込み操作によってインデックス付きフィールドが更新されると、MongoDB は関連するインデックスを更新するため、書込み操作のパフォーマンスに悪影響を与える可能性があります。

MongoDB アプリケーションでワイルドカード インデックスを使用して、名前が事前に確認されていない、または任意のフィールドに対してクエリを実行できます。 ワイルドカード インデックスは、ワークロードベースのインデックス プランニングを置き換えるように設計されていません。

データモデルの設計とアプリケーションに適したインデックスの選択の詳細については、 マニュアルの「 データ モデリングとインデックス MongoDB Server」のガイドを参照してください。

このガイドの例では、Atlasサンプルデータセットの データベース内の moviestheatersコレクションとsample_mflix コレクションを使用します。 MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイド を参照してください。

MongoDB は、データのクエリに役立ついくつかの異なるインデックス タイプをサポートしています。 以下のページでは、最も一般的なインデックス型について説明し、各インデックス型を作成するためのサンプルコードを示します。

  • 単一フィールド インデックス

  • 複合インデックス

  • Multikey Indexes

  • MongoDB Search インデックス

以下のセクションでは、他の一般的なインデックス型について説明し、各インデックス型を作成するためのサンプルコードを示します。

次の例では、theatersコレクションに GeoJSON オブジェクトを含む location.geoフィールドに 2dsphereインデックスを作成します。

bson_error_t error;
bson_t *keys = BCON_NEW("location.geo", BCON_UTF8("2dsphere"));
mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL);
if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) {
printf("Successfully created index\n");
} else {
fprintf(stderr, "Failed to create index: %s", error.message);
}
bson_destroy(keys);
mongoc_index_model_destroy(index_model);

GeoJSONデータ型の詳細については、 MongoDB Serverマニュアルの 「 GeoJSON オブジェクト」 を参照してください。

次の例では、titleフィールドに昇順のユニークインデックスを作成しています。

bson_error_t error;
bson_t *keys = BCON_NEW("title", BCON_INT32(1));
bson_t *opts = BCON_NEW("unique", BCON_BOOL(true));
mongoc_index_model_t *index_model = mongoc_index_model_new(keys, opts);
if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) {
printf("Successfully created index\n");
} else {
fprintf(stderr, "Failed to create index: %s", error.message);
}
bson_destroy(keys);
bson_destroy(opts);
mongoc_index_model_destroy(index_model);

次の例では、指定されたコレクションに昇順のワイルドカードを作成しています。

bson_error_t error;
bson_t *keys = BCON_NEW("$**", BCON_INT32(1));
mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL);
if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) {
printf("Successfully created index\n");
} else {
fprintf(stderr, "Failed to create index: %s", error.message);
}
bson_destroy(keys);
mongoc_index_model_destroy(index_model);

次の例では、 _idフィールドに昇順のクラスターインデックスを含む新しいコレクションを作成します。

bson_error_t error;
bson_t *opts = BCON_NEW("clusteredIndex", "{",
"key", "{",
"_id", BCON_INT32(1),
"}",
"unique", BCON_BOOL(true),
"}");
mongoc_database_t *database = mongoc_client_get_database(client, "sample_mflix");
if (mongoc_database_create_collection(database, "clustered_collection", opts, &error)) {
printf("Successfully created collection\n");
} else {
fprintf(stderr, "Failed to create collection: %s", error.message);
}
mongoc_database_destroy(database);
bson_destroy(opts);

次の例では、title stringフィールドにテキストインデックスを作成しています。

bson_error_t error;
bson_t *keys = BCON_NEW("title", BCON_UTF8("text"));
mongoc_index_model_t *index_model = mongoc_index_model_new(keys, NULL);
if (mongoc_collection_create_indexes_with_opts(collection, &index_model, 1, NULL, NULL, &error)) {
printf("Successfully created index\n");
} else {
fprintf(stderr, "Failed to create index: %s", error.message);
}
bson_destroy(keys);
mongoc_index_model_destroy(index_model);

_idフィールドのデフォルトのデフォルトユニークインデックスを除く未使用のインデックスを削除できます。 mongoc_collection_t 構造、インデックス名、オプションの bson_error_t 構造を mongoc_collection_drop_index() 関数に渡して、コレクションからインデックスを削除します。

次の例では、 moviesコレクションから"_title_"という名前のインデックスを削除します。

bson_error_t error;
if (mongoc_collection_drop_index(collection, "_title_", &error)) {
printf("Successfully dropped index\n");
} else {
fprintf(stderr, "Failed to drop index: %s", error.message);
}

注意

複合テキスト インデックスから単一のフィールドを削除することはできません。 インデックス フィールドを更新するには、インデックス全体を削除し、新しいインデックスを作成する必要があります。

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

戻る

時系列

項目一覧