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

シャーディングされたクラスターでの一意性の維持

シャーディングされたクラスターは、ユニークインデックスがシャードキーにある、またはプレフィックスとしてシャードキーが含まれている場合にのみ、シャード全体に一意の制約を強制します。このページでは、コレクションをシャーディングする ときに一意性を維持する方法について説明します。

すでにシャーディングされているコレクションにユニークインデックスを作成するには、「 既存のシャーディングされたコレクションに一意なインデックスを作成する 」を参照してください。シャードキー値の一意性を強制するには、「 シャードキー値に一意性を強制 」を参照してください。シャードキーの一部ではないフィールドに一意性を強制するには、「 シャードキーではないフィールドに一意性を強制 」を参照してください。

一意の制約があるコレクションを再シャーディングするには、新しいシャードキーが既存の一意なインデックスのユニークインデックス要件を満たす必要があります。詳細については、「 コレクションの再シャーディング 」を参照してください。

ユニークインデックスにより、インデックス フィールドに重複する値が保存されなくなります。シャーディングされたコレクションでは、各シャードは自分のデータの重複をチェックできるため、 MongoDB は特定のインデックスキー値を持つすべてのドキュメントが同じシャードに存在することが保証されている場合にのみ、クラスター全体に制約を強制できます。インデックスのプレフィックスとしてシャードキーを含めることで、それが保証されます。

範囲指定のシャーディングされたコレクションでは、次のインデックスのみが一意になります。

  • シャードキーのインデックス

  • デフォルトの _idインデックス、ただし、 インデックスは、 フィールドがシャードキーでない場合にのみ、シャードごとに一意の制約を強制します。_id_id

ユニークインデックスの制約とは、次のことを意味します。

  • シャーディングされたコレクションの場合、コレクションに複数の一意なインデックスがある場合、シャードキーはすべての一意なインデックスのプレフィックスではない限り、コレクションをシャードできません。

  • すでにシャーディングされたコレクションの場合、シャードキーがプレフィックスとして含まれていない限り、他のフィールドに一意なインデックスを作成することはできません。

  • ユニークインデックスは、インデックス付きフィールドがないドキュメントの null 値を保存します。欠落しているインデックスフィールドは、null インデックスキー値の別のインスタンスとして扱われます。詳細については、「 単一一意のフィールド インデックスにドキュメント フィールドがない場合 」を参照してください。

次の制約も適用されます。

  • ハッシュされたインデックスにユニーク制約を指定することはできません。

  • インデックスキーに照合がある場合、 MongoDB は照合が単純な場合にのみ一意性を確保できます。

  • シャードキーにユニークインデックスと、シャードキーの個々のコンポーネントではなく、キーの組み合わせ全体に一意性が強制されます。

重要

_id フィールドがシャードキーでない場合、シャードクラスターはクラスター全体で _id フィールドの一意性の制約を強制しません。

_idフィールドがシャードキーでない場合、一意制約はドキュメントを保存するシャードにのみ適用されます。つまり、異なるシャードで発生する場合には、2 つ以上のドキュメントが同じ _id 値を持つことができます。

例、2 つのシャード A と B にまたがるシャードキー{x: 1} を持つシャーディングされたコレクションを考えてみましょう。_id キーはシャードキーではないため、コレクションにはシャード A に _id 値 1 を持つドキュメントがある可能性があります。 、およびシャード B に _id 値 1 を持つ別のドキュメントが含まれている。

_idフィールドがシャードキーでない場合、 MongoDB、アプリケーションが _idフィールドに一意の識別子を使用して入力することで、シャード全体で _id 値の一意性を確保することを想定しています(例: )。

  • コレクションのシャードキーを識別します。シャーディングされたコレクションのシャードキーを表示するには、sh.status() メソッドを実行し、出力内のコレクションを見つけます。

  • 既存のドキュメントがフィールドの一意性制約に違反していないことを確認します。シャードに重複値を持つドキュメントが含まれている場合、インデックスの作成操作は重複のないシャードでは成功するものの、重複のあるシャードでは失敗する可能性があり、シャード間でインデックスが不一致になる可能性があります。

  • mongoshmongosを インスタンスに接続します。

次の例では、region_id で accounts.namesコレクションをシャーディングし、region_id と email の組み合わせに一意の制約を強制します。

1

シャードキーとして使用するインデックスを作成します。

db.names.createIndex( { region_id: 1 } )
region_id_1
2

コレクションのユニークインデックスを作成します。インデックスのプレフィックスとしてシャードキーを含めます。

db.names.createIndex(
{ region_id: 1, email: 1 },
{ unique: true }
)
region_id_1_email_1
3

コレクションをシャーディングするには、sh.shardCollection() メソッドを実行します。

sh.shardCollection( "accounts.names", { region_id: 1 } )
{
collectionsharded: 'accounts.names',
ok: 1,
'$clusterTime': {
clusterTime: Timestamp( { t: 1759260515, i: 58 } ),
signature: {
hash: Binary.createFromBase64( 'AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0 ),
keyId: Long( '0' )
}
},
operationTime: Timestamp( { t: 1759260515, i: 57 } )
}

シャードキーをプレフィックスとして含まないユニークインデックスを含むコレクションをシャードする場合、 コマンドを実行するとMongoDBshardCollection はエラーを返します。