ほとんどの場合、 のシャーディングされたクラスターは、ユーザーの介入なしに自動的に範囲の作成、分裂、分散を行います。ただし、場合によっては、 MongoDBでは十分な範囲を作成したり、必要なスループットをサポートするのに十分な速度でデータを分散したりできない場合があります。
例、シャード全体に挿入を分散しているクラスターに大量のデータを取り込む場合は、空のシャーディングされたコレクションの範囲を事前分割すると、スループットが向上します。
注意
MongoDB 6.0 以降、バランサーは空の範囲を配布しません。コレクションを事前に分割するには、moveRange を使用して空の範囲をクラスター内のシャード全体に分散します。moveRange は移動する範囲を自動的に分割します。つまり、moveRange は分割と移動の両方を実行します。splitで範囲を手動で分裂する必要はありません。
あるいは、空のコレクションまたは存在しないコレクションをシャーディングする 前に ゾーンとゾーンの範囲 を定義することで、シャード コレクション操作は定義されたゾーン範囲の範囲と、シャードキー値の全範囲をカバーする追加の範囲を作成し、ゾーン範囲に基づく初期範囲分散。For more information, see Empty Collection.
警告
空のコレクションの範囲のみを事前分割します。 入力されるコレクションの範囲を手動で分割すると、予測できない範囲とサイズだけでなく、バランシング動作が非効率的または非効果的になる可能性があります。
手順
次の例では、範囲を手動で生成して配布する方法を示しています。 この例では、 sample.documents名前空間のコレクションを使用し、そのコレクションをemailフィールドでシャーディングします。
シャードキー範囲の定義
シャードキー範囲を定義する関数を作成します。 この例では、 email がシャードキーとして使用されるため、可能なメールアドレスに基づいて範囲を作成します。
// Generate two character prefix email ranges. function getRanges(shards) {    let ranges = [];    // The total number of prefix possibilities is 26 * 26 (aa to zz).    // We calculate the number of combinations to add in a range.    const totalCombinationsPerShard = 26 * 26 / shards.length;    let minKey = {       email: MinKey    };    let maxKey = {       email: MinKey    };    for(let i = 1; i <= shards.length; ++i) {       // 97 is lower case 'a' in ASCII.       let prefix = 97 + ((totalCombinationsPerShard*i)/26);       let suffix = 97 + ((totalCombinationsPerShard*i)%26);       let initialChars = String.fromCharCode(prefix) + String.fromCharCode(suffix);       minKey = maxKey;       maxKey = {          email: i !== shards.length ? initialChars : MaxKey       };       ranges.push({          min: minKey,          max: maxKey       });    }    return ranges; } 
定義済みの範囲へのシャードの割り当て
ステップ 1 で定義された範囲にシャードを割り当てるには、次のコマンドを実行します。
const shards = db.adminCommand({    listShards: 1 }).shards; let ranges = getRanges(shards); for (let i = 0; i < ranges.length; ++i) {    db.adminCommand({       moveRange: 'sample.documents',       min: ranges[i].min,       max: ranges[i].max,       toShard: shards[i]._id    }); } 
結果
moveRange コマンドは、クラスター内のシャード全体に空の範囲を分散します。 クラスターは一括挿入用に最適化されました。
次のステップ
パフォーマンスをさらに向上させるには、アプリケーションの一般的なクエリをサポートするための追加のインデックスを作成します。
詳細
- シャーディングコマンドによって作成および分散された初期範囲については、「空のコレクション 」を参照してください。 
- バランサーとシャード間での範囲の自動分散については、「バランサーの内部と範囲の移行 」を参照してください。 
- 範囲を手動で移行する場合、「シャーディングされたクラスターで範囲を移行する 」を参照してください。