シャードキーは、クラスターのシャード間でコレクションのドキュメントの配布を決定する複合インデックスでカバーされる単一の インデックスされたフィールド、または複数のフィールドのいずれかです。
MongoDB は、シャードキー値(またはハッシュされたシャードキー値)の範囲を、重複しないシャードキー値(またはハッシュされたシャードキー値)の範囲に分割します。各範囲はチャンクに関連付けられており、MongoDB はチャンクをクラスター内のシャードに均等に分散しようとします。
シャードキーは、チャンク配布の有効性と直接的な関係があります。「シャードキーの選択」を参照してください。
シャードキー インデックス
シャーディングされたコレクションには通常、シャードキーをサポートするインデックスが必要です。インデックスは、シャードキー上のインデックス、またはシャードキーがインデックスのプレフィックスである複合インデックスにすることができます。
コレクションが空の場合、
sh.shardCollection()は、インデックスがまだ存在しない場合にはシャードキーにインデックスを作成します。コレクションが空でない場合、
sh.shardCollection()を使用する前に、まずインデックスを作成する必要があります。
シャードキーの最後の有効なインデックスを削除した場合は、シャードキーのみにインデックスを再作成することで回復します。
MongoDB 5.0.22以降ではハッシュされたシャードキーのインデックスを削除できます。詳細については、「ハッシュされたシャードキーインデックスの削除」をご覧ください。
Unique Indexes
MongoDB では、範囲指定されたシャードキー インデックスにユニーク制約を強制できます。シャードキーでユニークインデックスを使用することで、MongoDB はシャードキーの個々のコンポーネントではなく、キーの組み合わせ全体にユニーク性を強制します。
範囲指定のシャーディングされたコレクションでは、次のインデックスのみが一意になります。
シャードキーのインデックス
デフォルトの
_idインデックス、ただし、 インデックスは、 フィールドがシャードキーでない場合にのみ、シャードごとに一意の制約を強制します。_id_id
重要
シャーディングされたクラスターでは、 _idフィールドもシャードキーである場合にのみ、クラスター全体の_idフィールドに一意の制約が強制されます。
_idフィールドがシャードキーではない場合、またはシャードキーのプレフィックスのみの場合、一意制約はドキュメント を保存するシャードにのみ適用されます。 つまり、異なるシャードで発生する場合には、2 つ以上のドキュメントが同じ _id 値を持つことができます。
例、2 つのシャード A と B にまたがるシャードキー{x:
1} を持つシャーディングされたコレクションを考えてみましょう。_id キーはシャードキーではないため、コレクションにはシャード A に _id 値 1 を持つドキュメントがある可能性があります。 、およびシャード B に _id 値 1 を持つ別のドキュメントが含まれている。
_idフィールドがシャードキーではない場合、MongoDB では、アプリケーションがシャード全体で_id値の一意性を強制することを想定しています。
ユニークインデックスの制約とは、次のことを意味します。
シャーディングされたコレクションの場合、コレクションに複数の一意なインデックスがある場合、シャードキーはすべての一意なインデックスのプレフィックスではない限り、コレクションをシャードできません。
すでにシャーディングされたコレクションの場合、シャードキーがプレフィックスとして含まれていない限り、他のフィールドに一意なインデックスを作成することはできません。
ユニークインデックスは、インデックスフィールドがないドキュメントの NULL 値をストアします。つまり、インデックスフィールドがない場合は、
nullインデックスキー値の別のインスタンスとして扱われます。詳細については、「ユニークな単一フィールドインデックスにドキュメントフィールドがない場合」を参照してください。
シャードキー値の一意性を強制するには、unique パラメーターを true として sh.shardCollection() メソッドに渡します。
コレクションが空の場合、
sh.shardCollection()はシャードキーにユニークインデックスがなければそれを作成します。コレクションが空でない場合、
sh.shardCollection()を使用する前に、まずインデックスを作成する必要があります。
シャードキーがプレフィックスであるユニーク複合インデックスを持つことは可能ですが、unique パラメーターを使用する場合、コレクションにはシャードキー上のユニークインデックスが必要です。
ハッシュされたインデックスにユニーク制約を指定することはできません。
シャードキーではないフィールドの一意性を維持するには、「任意のフィールドに対する一意の制約 」を参照してください。
欠落しているシャードキー フィールド
シャーディングされたコレクション内のドキュメントには、シャード キー フィールドがないことがあります。 欠落しているシャードキー フィールドを設定するには、「 欠落しているシャードキー フィールドの設定 」を参照してください。
チャンクの範囲と欠落しているシャードキー フィールド
欠落しているシャードキー フィールドは、null 値を持つシャードキーと同じチャンク範囲内にあります。たとえば、シャードキーがフィールド { x:
1, y: 1 } にある場合、次のようになります。
シャードキーが欠落しているドキュメント | 同じ範囲に該当 |
|---|---|
|
|
|
|
|
|
読み取り操作および書き込み操作と欠落しているシャードキー フィールド
シャードキー フィールドが欠落しているドキュメントを対象とするには、シャードキー フィールドに { $exists: false } フィルター条件を使用できます。たとえば、シャードキーがフィールド { x: 1, y: 1
} にある場合、次のクエリを実行することで、シャードキー フィールドが欠落しているドキュメントを見つけることができます。
db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
ヌル等価一致フィルタ条件を指定した場合(つまり{ x: null
}) の場合、フィルターは、シャード キーフィールドが欠落しているドキュメント と、 シャードキーフィールドがに設定されているドキュメントの両方null に一致します。
upsert 指定による書き込みなど、一部の書き込み操作では、シャードキーの等価一致が必要です。このような場合、シャードキーが欠落しているドキュメントを対象とするには、null 等価一致に加えて別のフィルター条件を含めます。以下に例を挙げます。
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key