シャードキー
シャードキーは、クラスターのシャード間でコレクションのドキュメントの配布を決定する複合インデックスでカバーされる単一の インデックスされたフィールド、または複数のフィールドのいずれかです。
MongoDB は、シャードキー値(またはハッシュされたシャードキー値)の範囲を、重複しないシャードキー値(またはハッシュされたシャードキー値)の範囲に分割します。各範囲はチャンクに関連付けられており、MongoDB はチャンクをクラスター内のシャードに均等に分散しようとします。
シャードキーは、チャンク配布の有効性と直接的な関係があります。「シャードキーの選択」を参照してください。
シャードキー インデックス
すべてのシャーディングされたコレクションには、シャードキーをサポートするインデックスが必要です。インデックスは、シャードキー上のインデックス、またはシャードキーがインデックスのプレフィックスである複合インデックスにすることができます。
コレクションが空の場合、
sh.shardCollection()
は、インデックスがまだ存在しない場合にはシャードキーにインデックスを作成します。コレクションが空でない場合、
sh.shardCollection()
を使用する前に、まずインデックスを作成する必要があります。
シャードキーの最後の有効なインデックスを削除した場合は、シャードキーのみにインデックスを再作成することで回復します。
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 }
にある場合、次のようになります。
シャードキーが欠落しているドキュメント | 同じ範囲に該当 |
---|---|
{ x: "hello" } | { x: "hello", y: null } |
{ y: "goodbye" } | { x: null, y: "goodbye" } |
{ z: "oops" } | { x: null, y: null } |
読み取り操作および書き込み操作と欠落しているシャードキー フィールド
シャードキー フィールドが欠落しているドキュメントを対象とするには、シャードキー フィールドに { $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