シャーディングされたコレクションには、 シャードキーをサポートするインデックスが必要です。インデックスは、シャードキー上のインデックス、またはシャードキーがインデックスの プレフィックス である複合インデックスにすることができます。
コレクションが空の場合、
sh.shardCollection()は、インデックスがまだ存在しない場合にはシャードキーにインデックスを作成します。コレクションが空でない場合、
sh.shardCollection()を使用する前に、まずインデックスを作成する必要があります。sh.reshardCollection()を使用してコレクションを再シャーディングする場合、事前に新しいシャードキーにインデックスを作成する必要はありません。リシャーディング操作、必要なインデックスが自動的に構築されます。詳細については、「コレクションの再シャーディング」手順を参照してください。
シャードキーをサポートする唯一の非表示ではないインデックスである場合は、インデックスを削除または非表示にすることはできません。
MongoDB 7.0.3以降では (6.0.12、5.0.22でも利用可能) ハッシュされたシャードキーのインデックスを削除できます。詳細については、「ハッシュされたシャードキーインデックスの削除」をご覧ください。
Unique Indexes
MongoDBは、範囲シャードキーインデックスに一意の制約を強制することができます。シャードキーでユニークインデックスを使用すると、シャードキーの個々のコンポーネントではなく、キーの組み合わせ全体に一意性が強制されます。
範囲指定のシャーディングされたコレクションでは、次のインデックスのみが一意になります。
シャードキーのインデックス
デフォルトの
_idインデックス、ただし、 インデックスは、 フィールドがシャードキーでない場合にのみ、シャードごとに一意の制約を強制します。_id_id
重要
_id フィールドがシャードキーでない場合、シャードクラスターはクラスター全体で _id フィールドの一意性の制約を強制しません。
_idフィールドがシャードキーでない場合、一意制約はドキュメントを保存するシャードにのみ適用されます。つまり、異なるシャードで発生する場合には、2 つ以上のドキュメントが同じ _id 値を持つことができます。
例、2 つのシャード A と B にまたがるシャードキー{x:
1} を持つシャーディングされたコレクションを考えてみましょう。_id キーはシャードキーではないため、コレクションにはシャード A に _id 値 1 を持つドキュメントがある可能性があります。 、およびシャード B に _id 値 1 を持つ別のドキュメントが含まれている。
_idフィールドがシャードキーでない場合、 MongoDB、アプリケーションが _idフィールドに一意の識別子を使用して入力することで、シャード全体で _id 値の一意性を確保することを想定しています(例: )。
ユニークインデックスの制約とは、次のことを意味します。
シャーディングされたコレクションの場合、コレクションに複数の一意なインデックスがある場合、シャードキーはすべての一意なインデックスのプレフィックスではない限り、コレクションをシャードできません。
すでにシャーディングされたコレクションの場合、シャードキーがプレフィックスとして含まれていない限り、他のフィールドに一意なインデックスを作成することはできません。
ユニークインデックスは、インデックスフィールドがないドキュメントの NULL 値をストアします。つまり、インデックスフィールドがない場合は、
nullインデックスキー値の別のインスタンスとして扱われます。詳細については、「ユニークな単一フィールドインデックスにドキュメントフィールドがない場合」を参照してください。
シャードキー値の一意性を強制するには、unique パラメーターを true として sh.shardCollection() メソッドに渡します。
コレクションが空の場合、
sh.shardCollection()はシャードキーにユニークインデックスがなければそれを作成します。コレクションが空でない場合、
sh.shardCollection()を使用する前に、まずインデックスを作成する必要があります。
シャードキーがプレフィックスであるユニーク複合インデックスを持つことは可能ですが、unique パラメーターを使用する場合、コレクションにはシャードキー上のユニークインデックスが必要です。
ハッシュされたインデックスにユニーク制約を指定することはできません。
シャードキーではないフィールドの一意性を維持するには、「任意のフィールドに対する一意の制約 」を参照してください。