シャードキー
シャードキーは、クラスターのシャード間でコレクションのドキュメントの配布を決定する複合インデックスでカバーされる単一の インデックスされたフィールド、または複数のフィールドのいずれかです。
MongoDB は、シャードキー値(またはハッシュされたシャードキー値)の範囲を、重複しないシャードキー値(またはハッシュされたシャードキー値)の範囲に分割します。各範囲はチャンクに関連付けられており、MongoDB はチャンクをクラスター内のシャードに均等に分散しようとします。
シャードキーは、チャンク配布の有効性と直接的な関係があります。「シャードキーの選択」を参照してください。
シャードキー インデックス
すべてのシャーディングされたコレクションには、シャードキーをサポートするインデックスが必要です。インデックスは、シャードキー上のインデックス、またはシャードキーがインデックスのプレフィックスである複合インデックスにすることができます。
コレクションが空の場合、
sh.shardCollection()
は、インデックスがまだ存在しない場合にはシャードキーにインデックスを作成します。コレクションが空でない場合、
sh.shardCollection()
を使用する前に、まずインデックスを作成する必要があります。
シャードキーをサポートする唯一の非表示ではないインデックスである場合は、インデックスを削除または非表示にすることはできません。
Unique Indexes
MongoDB では、範囲指定されたシャードキー インデックスにユニーク制約を強制できます。シャードキーでユニークインデックスを使用することで、MongoDB はシャードキーの個々のコンポーネントではなく、キーの組み合わせ全体にユニーク性を強制します。
範囲指定のシャーディングされたコレクションでは、次のインデックスのみが一意になります。
シャードキーのインデックス
デフォルトの
_id
インデックス。重要
シャーディングされたクラスターでは、
_id
フィールドもシャードキーである場合にのみ、クラスター全体の_id
フィールドに一意の制約が強制されます。_id
フィールドがシャードキーではない場合、またはシャードキーのプレフィックスのみの場合、一意制約はドキュメントを保存するシャードにのみ適用されます。 つまり、異なるシャードで発生する場合には、2 つ以上のドキュメントが同じ_id
値を持つことができます。_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