refineCollectionShardKey
定義
refineCollectionShardKey
コレクションのシャードキーを変更するために、新しいフィールドをサフィックスとして既存のキーに追加します。 コレクションのシャードキーを調整すると、濃度が十分でないために既存のキーがジャンボ (分割できない)チャンクになる状況に対処できます。
注意
データ分散
シャードキーを調整する一環として、 refineCollectionShardKey
コマンドは、チャンク範囲とゾーン範囲を更新して、既存のキー フィールドの範囲値を変更せずに新しいフィールドを組み込みます。 つまり、シャードキーを改善しても、シャードまたはゾーン全体へのチャンクの分散にはすぐに影響しません。 将来の チャンクの分割 や移行は、ルーチンのシャーディング操作の一部として発生します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M 10 + クラスターまたはサーバーレス インスタンスではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
注意
refineCollectionShardKey
コマンドを使用するには、シャーディングされたクラスターの機能の互換性バージョン(fcv)が4.4
である必要があります。
このコマンドの構文は、次のとおりです。
db.adminCommand( { refineCollectionShardKey: "<database>.<collection>", key: { <existing key specification>, <suffix1>: <1|"hashed">, ... } } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
---|---|---|
string |
| |
ドキュメント | コレクションの新しいシャードキーとして使用するフィールドを指定するドキュメント。
サフィックス フィールドの場合は、フィールド値を次のいずれかに設定します。
|
アクセス制御
アクセス制御を使用して実行中の場合、コマンドを実行するにはrefineCollectionShardKey
データベースやコレクション に対する 特権アクションが必要です。つまり、ユーザーは、次の 特権 を付与する ロール を持っていなければなりません。
{ resource: { db: <database>, collection: <collection> }, actions: [ "refineCollectionShardKey" ] }
組み込みの clusterManager
ロールにより、適切な権限が付与されます。
Considerations
インデックスの考慮事項
- インデックスの存在
コマンドを実行する 前 に、 コマンドの指定された キー をサポートするインデックスが存在している必要があります。
サポート インデックスは、新しいシャードキー仕様で開始されるインデックスです。つまり、インデックス プレフィックスが新しいシャードキー仕様と一致する。 つまり、シャードキーを
{ x: 1, y: 1 }
{ x: 1 }
に変更するには、 かつ{ x: 1, y: 1 }
で始まるインデックスが存在する必要があります。例:{ x: 1, y: 1 }
{ x: 1, y: 1, a: 1, b: 1}
注意
サポートするインデックスを部分インデックスにすることはできません。
サポートインデックスはsparse indexにできません。
コレクションが
simple
以外の照合を使用する場合、サポート インデックスは{ locale: "simple" }
照合を指定する必要があります。
- ユニークインデックス
現在のシャード インデックスに一意の制約がある場合、新しいシャードキー インデックスにも一意の制約が必要です。
After creating the unique index to support the new shard key, drop the old shard key index before runningrefineCollectionShardKey
.Also, if the current shard index has a unique constraint, then the new shard key cannot specify"hashed"
for any of its fields.See also Sharded Collection and Unique Indexes.
- インデックス照合
- シャーディングされたコレクションのデフォルトの照合が
simple
以外の場合、インデックスには{ locale : "simple" }
の照合ドキュメントが含まれている必要があります。 フィールドがシャードキー パターンをサポートするインデックスの少なくとも 1 つには、単純照合が必要です。
警告
現在のシャードキー フィールドの範囲またはハッシュされたタイプは変更 しない でください。 データの不整合が発生します。 たとえば、シャードキーを{ customer_id: 1 }
から{ customer_id:
"hashed", order_id: 1 }
に変更 しないでください 。
例
test
データベースで例を設定するには、次の手順に従います。
次の
shardCollection
操作を使用して、test
データベース内のorders
コレクションをシャーディングします。 この操作では、customer_id
フィールドを初期シャードキーとして使用します。db.adminCommand( { shardCollection: "test.orders", key: { customer_id: 1 } } )
シャードキーをcustomer_id
フィールドとorder_id
フィールド{ customer_id: 1, order_id: 1 }
に変更するには、
Create the index
インデックスがまだ存在しない場合に新しいシャードキーをサポートするため。db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } ) refineCollectionShardKey
コマンドを実行して、order_id
フィールドをサフィックスとして追加します。db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
コマンドが正常に完了すると、コレクションのシャードキーは{ customer_id: 1, order_id: 1 }
に変更されました。 確認するには、 sh.status()
を実行します。
Tip
シャードキーを調整すると、コレクション内のすべてのドキュメントにサフィックス フィールドが存在しない場合があります。 欠落しているシャードキー フィールドを入力するには、「欠落しているシャードキー フィールド 」を参照してください。
シャードキーを検証する前に、コレクション内のすべてまたはほとんどのドキュメントにサフィックス フィールドが含まれていることを確認して、可能であれば、フィールドにその後にフィールドを入力する必要がないようにします。
以外の照合順序を持つコレクションsimple
test
データベースで例を設定するには、次の手順に従います。
フランス語の
fr
をデフォルトの照合として指定して、test
データベースにcafés
コレクションを作成します。db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); customer_id
フィールドを初期シャードキーとして使用してコレクションをシャーディングします。 コレクションにはデフォルトのfr
照合があり、simple
照合がないため、shardCollection
コマンドにはcollation: { locale: "simple" }
オプションを含める必要があります。db.adminCommand( { shardCollection: "test.cafés", key: { customer_id: 1 }, collation: { locale: "simple" } } )
シャードキーを変更して、 customer_id
フィールドとorder_id
フィールド{ customer_id: 1, order_id: 1 }
の両方を指定するには、
インデックスがまだ存在しない場合に新しいシャードキーをサポートするための
Create the index
コレクションは非単純な照合を使用するため、インデックスにはcollation: { locale: "simple" }
オプションを含める必要があります。db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) refineCollectionShardKey
コマンドを実行して、order_id
フィールドをサフィックスとして追加します。db.adminCommand( { refineCollectionShardKey: "test.cafés", key: { customer_id: 1, order_id: 1 } } )
コマンドが正常に完了すると、コレクションのシャードキーは{ customer_id: 1, order_id: 1 }
に変更されました。 確認するには、 sh.status()
を実行します。
Tip
シャードキーを調整すると、コレクション内のすべてのドキュメントにサフィックス フィールドが存在しない場合があります。 欠落しているシャードキー フィールドを入力するには、「欠落しているシャードキー フィールド 」を参照してください。
シャードキーを検証する前に、コレクション内のすべてまたはほとんどのドキュメントにサフィックス フィールドが含まれていることを確認して、可能であれば、フィールドにその後にフィールドを入力する必要がないようにします。