AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

インデックスの管理

このページでは、既存のインデックスを管理する方法を説明します。インデックスの作成手順については、特定のインデックス型のページを参照してください。

次のセクションでは、コレクションまたはデータベース全体の既存のインデックスを表示する方法について説明します。

コレクションのすべてのインデックスのリストを返すには、 db.collection.getIndexes()メソッドまたはドライバーの同様のメソッドを使用します。

例えば、 peopleコレクションのすべてのインデックスを表示するには、次のコマンドを実行します。

db.people.getIndexes()

データベース内のすべてのコレクション インデックスを一覧表示するには、 mongoshで次のコマンドを実行します。

db.getCollectionNames().forEach(function(collection) { indexes = db[collection].getIndexes(); print("Indexes for " + collection + ":"); printjson(indexes);});

すべてのデータベース内のすべてのコレクションの特定のタイプ(ハッシュやテキストなど)のすべてのインデックスを一覧表示するには、 mongoshで次のコマンドを実行します。

// The following finds all hashed indexes db.adminCommand("listDatabases").databases.forEach(function(d){ let mdb = db.getSiblingDB(d.name); mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){ let currentCollection = mdb.getCollection(c.name); currentCollection.getIndexes().forEach(function(idx){ let idxValues = Object.values(Object.assign({}, idx.key)); if (idxValues.includes("hashed")) { print("Hashed index: " + idx.name + " on " + d.name + "." + c.name); printjson(idx); }; }); });});

Tip

インデックスを削除する前に非表示にする

本番環境で頻繁に使用されているインデックスを削除すると、アプリケーションのパフォーマンスが低下する可能性があります。インデックスを削除する前に、インデックスを非表示にすることで、削除の潜在的な影響を評価できます。

非表示にされたインデックスはクエリのサポートに使用されることはありません。インデックスを非表示にしてパフォーマンスに大きな悪影響が見られる場合は、クエリがそのインデックスの使用を再開できるように、インデックスを保持して再表示することを検討してください。

既存のインデックスを削除する方法については、「インデックスの削除」を参照してください。

MongoDB Compass でインデックスを削除する方法については、「 Compass でのインデックスの管理 」を参照してください。

MongoDB Shell で既存のインデックスを変更するには、インデックスを削除して再作成する必要があります。このルールの例外はTTL インデックスです。これは、 collModコマンドとindexコレクション フラグを組み合わせて変更できます。

本番環境で頻繁に使用されているインデックスを削除すると、アプリケーションのパフォーマンスが低下する可能性があります。変更中もクエリでインデックスを使用するには、変更されたインデックスと同じフィールドを含む一時的な冗長インデックスを作成できます。

collMod コマンドを使用して非ユニークインデックスをユニークインデックスに変換する方法については、「既存のインデックスをユニークインデックスに変換する」を参照してください。

この例では、新しいインデックスを作成し、そのインデックスを一意になるように変更します。

1

次のコマンドを実行します。

db.siteAnalytics.createIndex( { "url": 1 } )

このコマンドは、インデックスの名前を返します。

url_1
2

次のコマンドを実行します。

db.siteAnalytics.createIndex( { "url": 1, "dummyField": 1 } )

このコマンドは、インデックスの名前を返します。

url_1_dummyField_1

この一時インデックスにより、パフォーマンスに影響を与えずに元の { "url": 1 } インデックスを安全に削除できます。

3

次のコマンドを実行します。

db.siteAnalytics.dropIndex( { "url_1" } )

このコマンドは、次のものを返します。

{ nIndexesWas: 3, ok: 1 }
4

次のコマンドを実行します。

db.siteAnalytics.createIndex( { "url": 1 }, { "unique": true } )

このコマンドは、インデックスの名前を返します。

url_1

url_1 インデックスが再作成され、パフォーマンスに影響を与えずに一時インデックスを削除できます。urlフィールドのクエリでは、新しい一意なインデックスを使用できます。

5

次のコマンドを実行します。

db.siteAnalytics.dropIndex( { "url_1_dummyField_1" } )

このコマンドは、次のものを返します。

{ nIndexesWas: 3, ok: 1 }
6

siteAnalyticsコレクションのインデックスを表示するには、次のコマンドを実行します。

db.siteAnalytics.getIndexes()

このコマンドは次のインデックスを返します。これは、url_1 インデックスが一意になったことを示しています。

[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { url: 1 }, name: 'url_1', unique: true }]

コレクションのチャンクを含む各シャードにまったく同じインデックス(インデックスオプションを含む)がない場合、シャーディングされたコレクションのインデックスには一貫性がありません。通常の操作では一貫性のないインデックスは発生しないはずですが、次のような一貫性のないインデックスが発生する可能性があります。

  • ユーザーが unique キー制約を使用してインデックスを作成していて、1 つのシャードに重複ドキュメントを含むチャンクが含まれている場合。このような場合、インデックスの作成操作は、重複のないシャードでは成功するものの、重複のあるシャードでは成功しない可能性があります。

  • ユーザーが複数のシャードにわたってインデックスをローリング処理で作成している(複数のシャードにわたって手作業でインデックスを 1 つずつ構築している)時、関連付けられたシャードのインデックス作成に失敗した場合、または異なる仕様で誤ったインデックスを構築した場合。

コンフィギュレーションサーバーのプライマリにより、デフォルトでは、シャーディングされたコレクションのシャード間でのインデックスの不整合がチェックされます。コマンドserverStatusがコンフィギュレーションサーバーのプライマリで実行されると、フィールドshardedIndexConsistencyが返され、インデックスの不整合があるシャーディングされたコレクションの数を報告します。

shardedIndexConsistency でインデックスの不一致が報告された場合は、シャーディングされたコレクションに対して checkIndexes: true を使用して checkMetadataConsistency コマンドを実行し、不整合を見つけることができます。

  1. checkMetadataConsistencyコマンドを実行します。

    db.runCommand( { checkMetadataConsistency: 1, checkIndexes: true} )
  2. コレクションに一貫性のないインデックスがある場合、checkMetadataConsistency コマンドは、一貫性のないインデックスに関する次のような詳細を返します。

    { cursor: { id: Long('0'), ns: 'test.$cmd.aggregate', firstBatch: [ { type: 'InconsistentIndex', description: 'Found an index of a sharded collection that is inconsistent between different shards', details: { namespace: 'test.reviews', info: { missingFromShards: [], inconsistentProperties: [ { k: 'expireAfterSeconds', v: Long('600') }, { k: 'expireAfterSeconds', v: 3600 } ], indexName: 'reviewDt_1' } } }, { type: 'InconsistentIndex', description: 'Found an index of a sharded collection that is inconsistent between different shards', details: { namespace: 'test.reviews', info: { missingFromShards: [ 'shard02' ], inconsistentProperties: [], indexName: 'page_1_score_1' } } } ] }, ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1752574769, i: 1 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1752574760, i: 1 })}

    出力には、シャーディングされたコレクションtest.reviews に 2つの不整合があることが示されています。

    1. reviewDt_1 という名前のインデックスには、コレクションのシャード間で一貫性のないプロパティがあります。特に expireAfterSeconds プロパティが異なります。

    2. page_1_score_1 という名前のインデックスが shard02のコレクションにありません。

特定のシャードのコレクションからインデックスが欠落しているという不整合を解決するには、

次のいずれかを実行できます。

警告

ローリングインデックスと複製されたインデックス構築プロセスを同時に実行すると、ビルドの失敗やクラッシュ ループなどの予期しない問題が発生する可能性があるため、避けてください。

シャード間でインデックス プロパティが異なる箇所を解決するには、

影響を受けるシャード上のコレクションから誤ったインデックスを削除し、インデックスを再構築します。インデックスを再構築するには、次のいずれかを実行します。

あるいは、expireAfterSeconds プロパティに不整合がある場合は、インデックスを削除して再構築する代わりに collMod コマンドを実行して秒数をアップデートすることもできます。