定義
- sh.shardCollection(namespace, key, unique, options)
- keyを シャードキーとして使用し、コレクションをシャードします。シャードキーで、MongoDB がコレクションのドキュメントをシャード間でどのように配布するかを決定します。- 注意- バージョン 6.0 での変更。 - MongoDB 6.0 以降では、コレクションをシャーディングする場合、最初に - sh.enableSharding()メソッドを実行してデータベースを構成する必要はありません。- 重要- mongosh メソッド- このページでは、 - mongoshメソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。- データベースコマンドについては、 - shardCollectionコマンドを参照してください。- MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。 - sh.shardCollection()以下の引数を取ります。Parameterタイプ説明- namespace- string - "<database>.<collection>"形式でシャーディングするコレクションの名前空間。- key- ドキュメント - シャードキー として使用するフィールドを指定するドキュメント。 - { <field1>: <1|"hashed">, ... }- フィールド値を次のいずれかに設定します。 - 1、範囲ベースのシャーディング用
- "hashed"ハッシュされたシャードキーを指定します。
 - シャードキーはインデックスでサポートされている必要があります。コレクションが空でない限り、 - shardCollectionコマンドの前にインデックスが存在している必要があります。コレクションが空の場合、シャードキーをサポートできるインデックスがまだ存在しない場合には、MongoDB はコレクションをシャーディングする前にインデックスを作成します。- 「シャードキー インデックス」も参照してください - unique- ブール値 - 任意。基礎のインデックスがユニーク制約を強制するようにするには、 - trueを指定します。デフォルトは- falseです。- ハッシュされたシャードキーを使用する場合、 - trueは指定できません。- optionsドキュメントを指定する場合は、- uniqueの値を明示的に指定する必要があります。- options- ドキュメント - 任意。 - numInitialChunksや- collationなどの任意フィールドを含むドキュメント。- options引数は以下のオプションをサポートしています。Parameterタイプ説明- numInitialChunks- integer - 任意。空のコレクションをハッシュされたシャードキーでシャーディングするときに最初に作成するチャンクの最小数を指定します。次に、MongoDB はクラスター全体でチャンクを作成し、バランスをとります。 - numInitialChunksパラメーターは、シャードあたり- 8192チャンク未満である必要があります。デフォルトはシャードあたり- 2チャンク。- コレクションが空でない場合、またはシャードキーにハッシュされたフィールドが含まれていない場合、操作はエラーを返します。 - presplitHashedZones: true でシャーディング場合、 MongoDB は指定された数のチャンクをクラスター内のゾーン全体に均等に分散しようとします。 
- presplitHashedZones: false または省略でシャーディング、空のコレクションにゾーンとゾーン範囲が定義されていない場合、 MongoDB は指定された数のチャンクをクラスター内のシャード全体に均等に分散しようとします。 
- presplitHashedZones: false または省略でシャーディング、空のコレクションに対してゾーンとゾーン範囲が定義されている場合、 - numInitChunksは効果がありません。
 - collation- ドキュメント - 任意。 - shardCollectionに指定されたコレクションにデフォルトの照合がある場合は、- { locale : "simple" }を使用して照合ドキュメントを含める必要があります 。そうしないと、- shardCollectionコマンドは失敗します。 フィールドがシャードキー パターンをサポートするインデックスの少なくとも 1 つには、単純照合が必要です。- ブール値 - 任意。 コレクションに定義されたゾーンとゾーン範囲に基づいて、空または存在しないコレクションの初期チャンク作成と分散を実行するには、 - trueを指定します。 ハッシュされたシャーディングのみ。- shardCollection()次のいずれかに当てはまる場合、- presplitHashedZones: trueと はエラーを返します。- シャードキーにはハッシュされたフィールドが含まれていません(単一フィールド ハッシュされたインデックスまたはハッシュされた複合インデックス ではない)。 
- コレクションには、定義されたゾーンまたはゾーン範囲はありません。 
- 定義されたゾーン範囲が要件を満たしていません。 
 - ドキュメント - 任意。 新しいシャーディングされた時系列コレクションを作成するには、このオプションを指定します。 - 既存の時系列コレクションをシャーディングするには、このパラメーターを省略します。 - shardCollectionに指定されたコレクションが時系列コレクションで、かつ- timeseriesオプションが指定されていない場合、MongoDB は既存の時系列コレクションを定義する値を使用して- timeseriesフィールドに入力します。- 詳細な構文については「時系列オプション 」を参照してください。 
時系列オプション
バージョン 5.1 で追加。
シャーディングされた新しい時系列コレクションを作成するには、timeseries オプションをsh.shardCollection()に指定します。
timeseries オプションには次のフィールドが含まれます。
| フィールド | タイプ | 説明 | 
|---|---|---|
| 
 | string | 必須。各時系列ドキュメントの日付を含むフィールドの名前。 時系列コレクション内のドキュメントには、  | 
| 
 | string | オプション。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、ユニークな一連のドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータは、変更されることはほとんどありません。 指定されたフィールドの名前は | 
| 
 | string | 任意。可能な値は次のとおりです。 
 デフォルトでは、MongoDB は高頻度の取り込みの場合、  時系列コレクション内のデータが内部的に保存される方法を最適化してパフォーマンスを向上させるには、  
 
 | 
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです 
重要
このコマンドは、M0 および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。
- MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン 
- MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン 
Considerations
MongoDB には、いったんシャーディングされたコレクションで、シャーディングを解除するメソッドがありません。
シャードキー
シャードキーは後でも変更できますが、スケーラビリティやパフォーマンスの問題を回避するために、シャードキーの選択を慎重にすることが重要になります。
時系列コレクションのシャードキー
時系列コレクションをシャーディングする場合、シャードキーで指定できるのは次のフィールドのみです。
- この - metaField
- サブフィールド - metaField
- この - timeField
シャードキーでこれらのフィールドの組み合わせを指定できます。シャードキーのパターンでは、_id を含む他のフィールドは許可されません。
シャードキーを指定する場合には、次のいずれかです。
- metaFieldまたは
- timeFieldでなければなりません:- シャードキーのパターン末尾 
 
Tip
timeField だけをシャードキーとして指定することは避けてください。timeField は単調に増加するため、すべての書き込みがクラスター内の 1 つのチャンクで発生することがあります。理想的には、データをチャンク間で均等に分散します。
シャードキーを最適に選択する方法については、以下を参照してください。
ハッシュされたシャードキー
ハッシュされたシャードキーは、ハッシュされたインデックスまたはハッシュされた複合インデックスをシャードキーとして使用します。
ハッシュされたシャードキー フィールドを指定するには、 field: "hashed"の形式を使用します。
注意
ハッシュされたシャードキー コレクションの作成中にチャンクの移行が進行中の場合、 バランサー がコレクションを自動的にバランス化するまでに、初期チャンク分散が不均一になる可能性があります。
ゾーン シャーディングと初期チャンク分散
シャード コレクション操作(つまり、shardCollectionコマンドとsh.shardCollection()ヘルパー)は、コレクションのゾーンおよびゾーン範囲が定義されている場合、空または存在しないコレクションの最初のチャンク作成および分散を実行できます。最初のチャンク分散により、ゾーン シャーディングをより速く設定できます。初期分散後、バランサーは通常どおりに今後のチャンク分散を管理します。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。 範囲指定または単一フィールドのハッシュされたシャードキーを使用してコレクションをシャーディングする場合、空のコレクションに対してゾーンとゾーン範囲が定義されていると、 numInitialChunksオプションは効果がありません。
複合ハッシュ インデックスを使用してコレクションをシャードするには、複合ハッシュ インデックスを使用した初期チャンク分散を参照してください。
複合ハッシュされたインデックスを使用した初期チャンク分散
MongoDB は、ハッシュされた複合インデックスでのコレクションのシャーディングをサポートしています。 複合ハッシュされたシャードキーを使用して、空のコレクションまたは存在しないコレクションをシャーディングする場合、MongoDB が初期チャンクの作成と分散を実行するために追加の要件が適用されます。
空のコレクションにゾーンとゾーン範囲が定義され、かつ presplitHashedZones が false の場合、numInitialChunks オプションは効果がありません。
例については、「 空または存在しないコレクションのゾーンとゾーン範囲の事前定義」を参照してください。
Tip
一意性
unique: trueを指定する場合
- コレクションが空の場合、 - sh.shardCollection()はシャードキーに一意なインデックスがなければそれを作成します。
- コレクションが空でない場合、 - sh.shardCollection()を使用する前に、まずインデックスを作成する必要があります。
シャードキーがプレフィックスであるユニーク複合インデックスを持つことは可能ですが、unique パラメーターを使用する場合、コレクションにはシャードキー上のユニークインデックスが必要です。
「シャーディングされたコレクションと一意のインデックス」も参照してください
照合
バージョン 3.4 で変更。
コレクションにデフォルトの照合がある場合、sh.shardCollection() コマンドには { locale: "simple" } の値を持つ collation パラメーターが含まれている必要があります。デフォルトの照合を使用する空でないコレクションの場合、フィールドがシャードキー パターンをサポートする単純照合のインデックスが少なくとも 1 つ必要です。
照合のないコレクションにはcollationオプションを指定する必要はありません。 照合のないコレクションに対して 照合オプションを指定しても、効果はありません。
書込み保証 (write concern)
mongosは、shardCollectionコマンドとそのヘルパーsh.shardCollection()の書込み保証(write concern)に"majority"を使用します。
例
簡単な使い方
records という名前のデータベースに people という名前のコレクションがある場合、次のコマンドは zipcode フィールドでコレクションをシャーディングします。
sh.shardCollection("records.people", { zipcode: 1 } ) 
オプションで使用
phonebookデータベースには、デフォルトの照合順序のないコレクションcontactsがあります。次の例では、sh.shardCollection()を使用してphonebook.contactsを次のものとシャードします。
- last_nameフィールドのハッシュされたシャードキー、
- 5初期チャンク、
- simpleの照合。
sh.shardCollection(   "phonebook.contacts",   { last_name: "hashed" },   false,   {     numInitialChunks: 5,     collation: { locale: "simple" }   } )