MongoDB の制限としきい値
このドキュメントでは、MongoDB システムのハード制限とソフト制限のコレクションを取り上げています。このページの制限は、特に指定がない限り、次のすべての環境でホストされる配置に適用されます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
MongoDB Atlas の制限
次の制限は、MongoDB Atlas でホストされている配置にのみ適用されます。 これらの制限のいずれかが組織にとって問題となる場合は、 Atlas サポートにお問い合わせください。
MongoDB Atlas クラスターの制限
コンポーネント | Limit |
---|---|
マルチリージョンクラスター内のシャード | 12 |
単一リージョン クラスターでのシャード | 50 |
マルチリージョン クラスターのクロスリージョン ネットワーク権限 | 40 。 また、プロジェクト内のクラスターは40を超えるリージョンにまたがっている場合は、このプロジェクトでマルチリージョンクラスターを作成することはできません。 |
レプリカセットまたはシャードごとに選挙可能なノード | 7 |
コンフィギュレーションサーバーのクラスター階層(最小値および最大値) | M30 |
MongoDB Atlas の接続制限とクラスター階層
MongoDB Atlas は、クラスター階層とクラスに基づいて同時着信接続数を制限します。MongoDB Atlas の接続制限はノードごとに適用されます。シャーディングされたクラスターの場合、MongoDB Atlas の接続制限は mongos ルーターごとに適用されます。mongos ルーターの数は、すべてのシャードのレプリカセットのノードの数と同じです。
読み込み設定(read preference)も、 MongoDB Atlas が特定のクエリに割り当てることができる接続の合計数に影響します。
MongoDB Atlas では、指定クラスター階層に対して次の接続制限が設けられています。
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
---|---|
M0 | 500 |
M2 | 500 |
M5 | 500 |
M10 | 1500 |
M20 | 3000 |
M30 | 3000 |
M40 | 6000 |
M50 | 16000 |
M60 | 32000 |
M80 | 96000 |
M140 | 96000 |
M200 | 128000 |
M300 | 128000 |
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
---|---|
M40 | 4000 |
M50 | 16000 |
M60 | 32000 |
M80 | 64000 |
M140 | 96000 |
M200 | 128000 |
M300 | 128000 |
M400 | 128000 |
M700 | 128000 |
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
---|---|
M0 | 500 |
M2 | 500 |
M5 | 500 |
M10 | 1500 |
M20 | 3000 |
M30 | 3000 |
M40 | 6000 |
M50 | 16000 |
M60 | 32000 |
M80 | 64000 |
M140 | 96000 |
M200 | 128000 |
M300 | 128000 |
注意
MongoDB Atlas では、MongoDB Atlas サービスをサポートするために、各クラスターへの接続が少数確保されます。
MongoDB Atlas マルチクラウド接続の制限
MongoDB Atlas のマルチクラウド配置にプライベート接続を経由して接続する場合、クラウドプロバイダーは接続元と同じノードにのみアクセスできます。このクラウドプロバイダーには、そのリージョンにプライマリノードがない場合があります。その場合、配置にアクセスするには、接続文字列でセカンダリの読み込み設定 (read preference) モードを指定する必要があります。
MongoDB Atlas をマルチクラウドに配置しており、すべてのノードに現在のプロバイダーからプライベート接続でアクセスする必要がある場合は、次のいずれかのアクションを実行します。
現在のプロバイダーで残りの各プロバイダーへの VPN を構成します。
MongoDB Atlas へのプライベートエンドポイントは、残りのプロバイダーごとに設定します。
MongoDB Atlas のコレクション制限とインデックス制限
単一の MongoDB Atlas クラスター内のコレクションの数に厳密な制限はありませんが、多数のコレクションとインデックスを処理するとクラスターのパフォーマンスが低下する可能性があります。コレクションが大きいほど、パフォーマンスへの影響が大きくなります。
MongoDB Atlas クラスター階層ごとに推奨されるコレクションとインデックスの最大合計数は次のとおりです。
MongoDB Atlas Cluster Tier | 推奨最大値 |
---|---|
M10 | 5,000 コレクションとインデックス |
M20 / M30 | 10,000 コレクションとインデックス |
M40 /+ | 100,000 コレクションとインデックス |
MongoDB Atlas の組織とプロジェクトの制限
MongoDB Atlas の配置では、組織とプロジェクトに次の制限が適用されます。
コンポーネント | Limit |
---|---|
MongoDB Atlas プロジェクトごとのデータベースユーザー数 | 100 |
MongoDB Atlas プロジェクトごとの Atlas ユーザー数 | 500 |
MongoDB Atlas 組織あたり Atlas ユーザー数 | 500 |
MongoDB Atlas 組織あたり API キー数 | 500 |
MongoDB Atlas プロジェクトごとのアクセス リスト エントリー | 200 |
MongoDB Atlas チームあたりユーザー数 | 250 |
MongoDB Atlas プロジェクトあたりチーム数 | 100 |
MongoDB Atlas 組織あたりチーム数 | 250 |
MongoDB Atlas user あたりチーム数 | 100 |
MongoDB Atlas user あたり組織数 | 250 |
MongoDB Atlas ユーザーあたりのリンクされた組織数 | 50 |
MongoDB Atlas プロジェクトあたりクラスター数 | 25 |
MongoDB Atlas 組織あたりプロジェクト数 | 250 |
MongoDB Atlas プロジェクトごとのカスタム MongoDB ロール | 100 |
データベース・ユーザーごとに割り当てられるロール | 100 |
MongoDB Atlas 組織あたりの時間単位の課金 | $50 |
MongoDB Atlas プロジェクトあたりのフェデレーティッドデータベースインスタンス数 | 25 |
MongoDB Atlas プロジェクトあたりネットワーク ピアリング接続合計数 | 50。さらに、MongoDB Atlas は、プロジェクトのために選択されたCIDR ブロックとリージョンに基づいて、ネットワークピアリング接続ごとのノード数を制限します。 |
MongoDB Atlas プロジェクトあたり保留中のネットワーク ピアリング接続数 | 25 |
Amazon Web Services Private Linkのリージョンあたりのアドレス指定可能なターゲット数 | 50 |
Azure PrivateLink のリージョンあたりのアドレス指定可能なターゲット数 | 150 |
MongoDB Atlas が管理するグローバルクラスター プロジェクトあたり固有シャードキー数 | 40 。 これは、 Atlas マネージド シャーディングを持つグローバルクラスターにのみ適用されます。 自己管理型シャーディングを持つグローバルクラスターのプロジェクトごとの固有のシャードキーの数に制限はありません。 |
MongoDB Atlas プロジェクトあたりAtlas Data Lakeパイプライン数 | 25 |
M0 MongoDB Atlas プロジェクトあたりクラスター数 | 1 |
MongoDB Atlas サービスアカウントの制限
MongoDB Atlas サービスアカウントには、組織とプロジェクトに次の制限があります。
コンポーネント | Limit |
---|---|
MongoDB Atlas 組織ごとの Atlas サービスアカウント | 200 |
MongoDB Atlas サービスアカウントごとのアクセス リスト エントリ | 200 |
MongoDB Atlas サービスアカウントごとのシークレット数 | 2 |
MongoDB Atlas サービスアカウントあたりのアクティブなトークン数 | 100 |
MongoDB Atlas ラベルの制限
MongoDB Atlas では、次のコンポーネント ラベルで長さが制限され、正規表現要件が適用されます。
コンポーネント | 文字数制限 | 正規表現パターン |
---|---|---|
クラスター名 | 64 [1] | ^([a-zA-Z0-9]([a-zA-Z0-9-]){0,21}(?<!-)([\w]{0,42}))$ [2] |
プロジェクト名 | 64 | ^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3] |
組織名 | 64 | ^[\p{L}\p{N}\-_.(),:&@+']{1,64}$ [3] |
API キーの説明 | 250 |
[1] | ピアリング専用モードが有効になっている場合、クラスター名は最大 23 文字です。 |
[2] | MongoDB Atlas ではクラスター名の最初の 23 文字が使用されます。これらの文字はクラスターのプロジェクト内で一意である必要があります。23 文字未満のクラスター名の末尾には、ハイフン(- )を使用できません。23 文字を超えるクラスター名では、23 番目の文字にはハイフンを使用できません。 |
[3] | (1、2) 組織名とプロジェクト名には Unicode 文字または数字、および句読点(-_.(),:&@+' を含めることができます。 |
サーバーレス インスタンス、無料クラスター、共有クラスターの制限
MongoDB Atlas のサーバーレス インスタンス、無料クラスター、共有クラスターには、追加の制限が適用されます。詳細については、次のリソースを参照してください。
MongoDB Atlas コマンドの制限
一部の MongoDB コマンドは MongoDB Atlas ではサポートされません。また、一部のコマンドは MongoDB Atlas の無料クラスターでのみサポートされます。詳細については、次のリソースを参照してください。
BSON ドキュメント
- BSON ドキュメントのサイズ
BSON ドキュメントの最大サイズは 16 MB です。
ドキュメントの最大サイズを設定すると、単一ドキュメントが過大な量の RAM を使用したり、送信中に過大な量の帯域幅を使用したりする問題が軽減します。MongoDB では、最大サイズを超えるドキュメントは、GridFS API を使用して保存できます。GridFS の詳細については、「
mongofiles
」および使用しているドライバーのドキュメントを参照してください。
- BSON ドキュメントのネストの深さ
MongoDB では、BSON ドキュメントで 100 レベル以下のネストがサポートされます。オブジェクトまたは配列ごとにレベルが追加されます。
命名制限
- データベース名での大文字と小文字の使用
データベース名は大文字と小文字を区別しません。そのため、
salesData
とSalesData
のような名前のデータベースを 2 つ使用することはできません。MongoDB でデータベースを作成したら、そのデータベースを参照する際に一貫した大文字小文字の使用が必要です。例として、
salesData
データベースを作成する場合は、salesdata
やSalesData
のように大文字と小文字を入れ替えたものを使用しないよう注意してください。
- Windows のデータベース名に関する制限
Windows で実行中の MongoDB の配置について、データベース名に次の文字は使えません。
/\. "$*<>:|? また、データベース名に「null」の文字を含めることはできません。
- Unix および Linux システムにおけるデータベース名の制限
Unix および Linux システムで実行中の MongoDB 配置の場合、データベース名に次の文字は使えません。
/\. "$ また、データベース名に「null」の文字を含めることはできません。
- コレクション名の制限
コレクション名はアンダースコアまたは文字で始める必要があり、次のことはできません。
$
を含む。空の文字列である(例:
""
)。「null」の文字が含まれる。
system.
で始まる。(内部で使用するため利用できません。).system.
が含まれる。
コレクション名にアンダースコアなどの特殊文字が含まれている場合、または数字で始まる場合は、コレクションにアクセスするために、
mongosh
のdb.getCollection()
メソッドまたは ドライバーの同様のメソッドを使用します。名前空間の長さ:
featureCompatibilityVersionが
"4.4"
以上に設定されている場合、MongoDB はコレクションまたはビューの名前空間の制限を255バイトに引き上げます。 コレクションまたはビューの名前空間には、データベース名、ドット(.
)セパレーター、コレクションまたはビューの名前(例:<database>.<collection>
)、
- フィールド名に関する制限
フィールド名に
null
文字を含めることはできません。サーバーでは、ドット(
.
)とドル記号($
)を含むフィールド名を保存できます。MongodB 5.0 では、フィールド名における(
$
)および(.
)の使用に対するサポートが強化されました。制限事項がいくつかあります。詳細については、フィールド名の考慮事項を参照してください。
命名に関する警告
警告
このセクションで説明されている問題は、データの損失または破損につながる可能性があるため注意してください。
MongoDB は重複するフィールド名をサポートしていません。
MongoDB クエリ言語はフィールド名が重複するドキュメントをサポートしていません。BSON ビルダによっては、重複するフィールド名を持つ BSON ドキュメントの作成をサポートしている場合がありますが、これらのドキュメントを MongoDB に挿入した場合、挿入が成功したように見えてもサポートされていません。たとえば、MongoDB ドライバーを使用して重複しているフィールド名を持つ BSON ドキュメントを挿入すると、挿入前にドライバーが勝手に重複値を削除したり、重複フィールドを含む無効なドキュメントが挿入されたりする可能性があります。このようなドキュメントに対してクエリを実行すると、無作為で一貫性のない結果になります。
ドル記号($
)とピリオド(.
)に関するインポートとエクスポートの問題
MongoDB 5.0 以降、ドキュメントフィールド名に接頭辞としてドル記号($
)を付けたり、ピリオド(.
)を含めたりすることができます。ただし、フィールド名にこれらの記号が使用されている場合、状況によっては mongoimport
と mongoexport
が通常どおりに動作しないことがあります。
MongoDB Extended JSON v2では、型ラッパーと、型ラッパーと同じ名前を持つフィールドを区別できません。対応する BSON 表現にドル( $
)で始まるキーが含まれる可能性があるコンテキストでは、拡張 JSON 形式を使用しないでください。DBRef メカニズムは、この一般ルールの例外です。
フィールド名にピリオド(.
)が含まれる状態での mongoimport
と mongoexport
の使用にも制限があります。CSV ファイルではデータ階層を表すのにピリオド(.
)が使用されるため、フィールド名のピリオド(.
)はネストのレベルと誤解されます。
ドル記号($
)とピリオド(.
)の使用によるデータ損失の可能性
ドル記号($
)で始まるフィールド名や、ピリオド(.
)を含むフィールド名を使用し、MongoDB 5.0 以前のサーバーで未確認の書き込み(書き込み確認(write concern)w=0
)と組み合わせて使用すると、頻度は低いもののデータが失われる可能性があります。
insert 、 update 、およびfindAndModifyコマンドを実行すると、5.0 互換のドライバーは、ドル記号( $
)のプレフィックスが付いたフィールド名またはピリオド( .
)を含むフィールド名を持つドキュメントの使用に対する制限を解除します。 これらのフィールド名は、以前のドライバー バージョンではクライアント側のエラーを引き起こしていました。
ドライバーが接続されているサーバー バージョンに関係なく、制限は解除されます。5.0 ドライバーが古いサーバーにドキュメントを送信すると、エラーを送信することなくドキュメントは拒否されます。
名前空間
- 名前空間の長さ
featureCompatibilityVersionが
"4.4"
以上に設定されている場合、MongoDB はコレクションまたはビューの名前空間の制限を255バイトに引き上げます。 コレクションまたはビューの名前空間には、データベース名、ドット(.
)セパレーター、コレクションまたはビューの名前(例:<database>.<collection>
)、
Indexes
- クエリでは、テキスト インデックスと地理空間インデックスを併せて使用できません
特殊な テキスト インデックス を必要とする
$text
クエリと、異なるタイプの特殊なインデックスを必要とするクエリ演算子を組み合わせることはできません。例として、$text
クエリと$near
演算子を組み合わせることはできません。
- 2dsphere インデックスを持つフィールドにはジオメトリのみを保持できます
2dsphere インデックスを持つフィールドには、座標ペアまたは GeoJSON データの形式でジオメトリ データを格納する必要があります。
2dsphere
インデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphere
インデックスを構築しようとしたりすると、操作は失敗します。
- WiredTiger ストレージエンジンによって対象クエリから返される NaN 値は、常に double 型です
インデックスによってカバーされているクエリから返されるフィールドの値が
NaN
の場合、そのNaN
値の型は常にdouble
になります。
- Multikey Index
マルチキー インデックスは、配列フィールドに対する カバー クエリは実行できません。
- インデックス構築におけるメモリ使用量
createIndexes
は、コレクションに 1 つ以上のインデックスの構築をサポートしています。createIndexes
はメモリとディスク上の一時ファイルの組み合わせを使用してインデックス構築を完了します。createIndexes
のメモリ使用量のデフォルト制限は200メガバイトで、単一のcreateIndexes
コマンドを使用してビルドされたすべてのインデックスに共有されます。 メモリ制限に達すると、createIndexes
は--dbpath
ディレクトリ内の_tmp
という名前のサブディレクトリにある一時ディスク ファイルを使用してビルドを完了します。maxIndexBuildMemoryUsageMegabytes
サーバー パラメータを設定することで、メモリ制限を上書きできます。メモリ制限を高く設定すると、より早くインデックス構築を完了できる可能性があります。ただし、システム上の未使用 RAM に対してこの制限を高く設定しすぎると、メモリが不足し、サーバーがシャットダウンする可能性があります。機能の互換性バージョン (fcv)
"4.2"
以降では、インデックス構築でのメモリ制限がすべてのインデックス構築に適用されます。
インデックスのビルドは、インデックスの作成などのユーザー コマンドまたは最初の同期などの管理プロセスによって開始される場合があります。 どちらも
maxIndexBuildMemoryUsageMegabytes
が設定した制限の対象となります。最初の同期操作では一度に 1 つのコレクションのみが取り込まれるため、メモリ制限を超えるリスクはありません。 ただし、ユーザーが複数のデータベースの複数のコレクションに対して同時にインデックス ビルドを開始し、
maxIndexBuildMemoryUsageMegabytes
で設定された制限以上のメモリを消費する可能性があります。Tip
レプリカセットおよびレプリカセット シャードを含むシャーディングされたクラスターへのインデックス構築の影響を最小限に抑えるには、「レプリカセットでのローリング インデックス構築」で説明されているローリング インデックス構築手順を使用してください。
- 照合順序とインデックスの種類
次のインデックス タイプは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。
text indexes,
2dインデックス、
geoHaystack indexes.
Tip
単純ではない照合順序を持つコレクションに
text
、2d
、またはgeoHaystack
インデックスを作成するには、インデックスの作成時、{collation: {locale: "simple"} }
を明示的に指定する必要があります。
- Hidden Indexes
_id
インデックスは非表示にできません。非表示のインデックスでは
hint()
を使用できません。
ソート
データ
- 上限付きコレクション内の最大ドキュメント数
max
パラメータを使用してcreate
に上限付きコレクションの最大ドキュメント数を指定する場合、その制限は2 32ドキュメント未満である必要があります。 Capped コレクションの作成時にドキュメントの最大数を指定しない場合、ドキュメント数の制限はありません。
レプリカセット
- レプリカセットの投票ノード数
レプリカセットには最大 7 つの投票ノードを含めることができます。合計ノード数が 7 を超えるレプリカセットについては、「投票権のないノード」を参照してください。
- 自動作成 oplog の最大サイズ
oplog サイズを明示的に指定しない場合(つまり、
oplogSizeMB
または--oplogSize
を使用する場合)、MongoDB は 50 ギガバイト以下の oplog を作成します。[4][4] oplog は、 majority commit point
が削除されるのを回避するために、設定されたサイズ制限を超えて大きくなることがあります。
シャーディングされたクラスター
シャーディングされたクラスターには、ここで説明する制限としきい値があります。
シャーディング操作上の制限
- シャーディングされた環境で利用できない操作
$where
は、$where
関数からdb
オブジェクトへの参照を許可しません。これは、シャーディングされていないコレクションでは珍しいことです。geoSearch
コマンドはシャーディングされた環境ではサポートされていません。MongoDB 5.0 以前のバージョンでは、
$lookup
ステージのfrom
パラメーターでシャーディングされたコレクションを指定できません。
- シャーディングされたクラスターのカバーされたクエリ
mongos
で実行すると、インデックスにシャードキーが含まれている場合にのみ、シャーディングされたコレクションのクエリをカバーできます。
- 既存のコレクション データ サイズのシャーディング
既存のコレクションは、そのサイズが特定の制限を超えない場合にのみシャーディングできます。 これらの制限は、すべてのシャードキー値の平均サイズと構成されたチャンクサイズに基づいて推定できます。
重要
これらの制限は、最初のシャーディング操作にのみ適用されます。 シャーディングされたコレクションは、シャーディングを正常に有効にすると任意のサイズに拡大できます。
MongoDB は、作成時に各チャンクが半分になるようにコレクション内のドキュメントを分散します。 論理的な最大コレクション サイズを計算するには、次の式を使用します。
maxSplits = 16777216 (bytes) / <average size of shard key values in bytes> maxCollectionSize (MB) = maxSplits * (chunkSize / 2) 注意
BSONドキュメントの最大サイズは16 MB または
16777216
バイトです。すべての変換ではベースと2スケールを使用する必要があります。例: 1024キロバイト = 1メガバイト
maxCollectionSize
がターゲット コレクション未満またはほぼ等しい場合は、初期シャーディングを成功させるために、チャンク サイズを増やします。 計算の結果がターゲット コレクション サイズに「近い」かどうかという懸念がある場合は、チャンク サイズを増やすことをお勧めします。最初のシャーディングが成功したら、必要に応じてチャンク サイズを縮小できます。 後でチャンクのサイズを縮小すると、すべてのチャンクが新しいサイズに分裂するまでに時間がかかる場合があります。 チャンク サイズを変更する手順については、「 シャーディングされたクラスターのチャンク サイズの変更」を参照してください。
以下の表は、上記の式を使用して、おおよその最大コレクション サイズを示しています。
シャードキー値の平均サイズ512バイト256バイト128バイト64バイト分割の最大数32,76865,536131,072262,144最大コレクション サイズ( 64 MB チャンク サイズ)1 TB2 TB4 TB8 TB最大コレクション サイズ( 128 MB チャンク サイズ)2 TB4 TB8 TB16 TB最大コレクション サイズ( 256 MB チャンク サイズ)4 TB8 TB16 TB32 TB
- シャーディングされたコレクションにおける単一ドキュメントの変更操作
justOne
またはmulti: false
オプションを指定するシャーディングされたコレクションに対してupdate
およびremove()
操作を使用するには以下に従ってください。1つのシャードのみをターゲットにする場合は、クエリ仕様で部分的なシャードキーを使用するか、
クエリ仕様でシャードキーまたは
_id
フィールドを指定できます。
- シャーディングされたコレクションにおけるユニークインデックス
MongoDB は、ユニークインデックスにインデックスのプレフィックスとして完全なシャードキーが含まれている場合を除き、シャード間のユニークインデックスをサポートしていません。このような状況では、MongoDB は単一のフィールドではなく、キー全体に対して一意性を強制します。
- 移行するチャンクあたりのドキュメントの最大数
デフォルトでは、チャンク内のドキュメント数が、構成されたチャンク サイズを平均ドキュメント サイズで割った結果の1.3倍を超える場合、MongoDB はチャンクを移動できません。
db.collection.stats()
には、コレクション内の平均ドキュメント サイズを表すavgObjSize
フィールドが含まれます。移行するには大きすぎるチャンクの場合(MongoDB 4.4以降)
新しいバランサー設定を
attemptToBalanceJumboChunks
に設定すると、チャンクにjumboというラベルが付いていない限り、バランサーが大きすぎて移動できないチャンクを移行できます。 詳細については 、「サイズ制限を超えるバランス チャンク」を参照してください。moveChunk
コマンドで新しいオプションforceJumboを指定すると、移動できないほど大きいチャンクの移行が可能になります。 そのチャンクにはジャンボ というラベルが付いている場合と付いていない場合があります。
シャードキーの制限
- シャードキー インデックスの種類
シャードキー インデックスは、シャードキーの昇順インデックス、シャードキーで始まりシャードキーの昇順を指定する複合インデックス、またはハッシュインデックスにすることができます。
シャードキー インデックスは、以下のようにはできません。
- シャードキー選択
シャードキーを変更するためのオプションは、実行している MongoDB のバージョンによって異なります。
MongoDB 5.0 以降では、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
既存のシャードキーにサフィックス フィールドを追加することで、シャードキーを調整できます。
- 単調に増加するシャードキーは挿入スループットを制限する可能性があります
挿入量が多いクラスターでは、単調に増加したり減少したりするシャードキーが挿入スループットに影響を与える可能性があります。シャードキーが
_id
フィールドである場合、_id
フィールドのデフォルト値は一般に増加する値を持つ ObjectId であることに注意してください。単調に増加するシャードキーを持つドキュメントを挿入する場合、挿入されたすべてのドキュメントは単一のシャード上の同じチャンクに属します。最終的に、システムがすべての書き込み操作を受けるチャンク範囲を分割し、その内容を移行してデータをより均等に分散させます。ただし、クラスターは常に挿入操作を単一のシャードにのみ指示するため、挿入スループットのボトルネックが生じます。
クラスターでの操作が主に読み取り操作と更新である場合、この制限はクラスターに影響しない可能性があります。
この制約を回避するには、ハッシュされたシャードキーを使用するか、単調に増加または減少しないフィールドを選択します。
ハッシュされたシャードキーとハッシュされたインデックスには、昇順の値を持つキーのハッシュが格納されます。
操作
- ソート操作
MongoDB は、1 つまたは複数のインデックスを使用してソート順序を取得できない場合、データに対してブロッキングソート操作を実行する必要があります。この名前は、
SORT
ステージが出力ドキュメントを返す前にすべての入力ドキュメントを読み取り、その特定のクエリのデータフローをブロックするという要件に由来しています。MongoDB でのブロッキング ソート操作に 100 メガバイトを超えるシステム メモリが必要な場合、クエリが
cursor.allowDiskUse()
を指定していない限り、MongoDB はエラーを返します。allowDiskUse()
を指定することで、MongoDB は 100 メガバイトのシステムメモリ制限を超えるデータをディスク上の一時ファイルに保存し、ブロッキングソート操作を処理することができます。ソートとインデックスの使用の詳細については、「ソートとインデックスの使用」を参照してください。
- 集計パイプライン ステージ
MongoDBは、単一のパイプラインで許可される集計パイプラインステージの数を 1000 に制限します。
集計パイプラインが解析される前または解析された後に ステージの制限を超えると、エラーが発生します。
- 集計パイプライン メモリ
パイプラインの各ステージには 100 MB の RAM 制限があります。 デフォルトでは、 ステージがこの制限を超えると、MongoDB はエラーを発生させます。 一部のパイプライン ステージでは、 allowDiskUseオプションを使用して一時ファイルにデータを書込む集計パイプライン ステージを有効にすることで、パイプライン処理がより多くのスペースを消費するようにできます。
$search
集計ステージは別のプロセスで実行されるため、 RAM の 100 メガバイトに制限されません。allowDiskUseが
true
の場合にディスクに書き出すことができるステージの例は次のとおりです。$sort
ソート操作がインデックスでサポートされていない場合
注意
パイプライン ステージはドキュメントのストリームに対して動作し、各パイプライン ステージはドキュメントを取り込んで処理し、その結果となるドキュメントを出力します。
一部のステージでは、受信したドキュメントをすべて処理するまでドキュメントを出力できません。これらのパイプライン ステージは、すべての受信ドキュメントが処理されるまで、ステージ出力を RAM に保持する必要があります。その結果、これらのパイプライン ステージでは 100 MB の制限を超えるスペースが必要になる場合があります。
$sort
パイプライン ステージのいずれかの結果が制限を超える場合は、$limit ステージの追加を検討してください。プロファイラー ログ メッセージと診断ログ メッセージには、メモリ制限のために集計ステージで一時ファイルにデータが書込まれた場合、
usedDisk
インジケーターが含められます。
- 集計と読み取り保証
$out
ステージは読み取り保証 (read concern)"linearizable"
と組み合わせて使用することはできません。db.collection.aggregate()
に対して"linearizable"
読み取り保証 (read concern) を指定した場合、パイプライン内に$out
ステージを含めることはできません。$merge
ステージは読み取り保証(read concern)"linearizable"
と組み合わせて使用することはできません。つまり、db.collection.aggregate()
に対して読み取り保証(read concern)"linearizable"
を指定した場合、パイプラインに$merge
ステージを含めることはできません。
- 地理空間クエリ
球面クエリの場合は、
2dsphere
インデックス結果を使用します。球面クエリに
2d
インデックスを使用すると、北極と南極が入っている球面クエリに2d
インデックスを使用するなど、誤った結果が生じる可能性があります。
- GeoJSON ポリゴンの面積
$geoIntersects
または$geoWithin
の場合、単一の半球よりも大きい面積を持つ単一リングの多角形を指定する場合は、the custom MongoDB coordinate reference system in the $geometry
式が含まれます。それ以外の場合、補完ジオメトリに対して$geoIntersects
または$geoWithin
クエリを実行します。 半球より大きい面積を持つその他すべての GeoJSON 多角形については、補完ジオメトリに対して$geoIntersects
または$geoWithin
クエリを実行します。
- マルチ ドキュメント トランザクション
マルチドキュメントトランザクションの場合は次のとおりです。
コレクションとインデックスはトランザクション内で作成できます。詳細については、「トランザクション内でのコレクションとインデックスの作成」を参照してください。
トランザクションで使用されるコレクションは、異なるデータベースにある可能性があります。
注意
クロスシャードの書き込みトランザクションでは新しいコレクションを作成できません。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。
Capped コレクションには書き込めません。
Capped コレクションから読み取る場合、読み取り保証(read concern)
"snapshot"
は使用できません。(MongoDB 5.0 以降)config
データベース、admin
データベース、またはlocal
データベース内のコレクションの読み取りと書き込みはできません。system.*
コレクションに書き込み (write) はできません。explain
または類似コマンドを使用して、サポートされている操作のクエリプランを返すことはできません。
トランザクションの外部で作成されたカーソルの場合、トランザクション内で
getMore
を呼び出せません。トランザクション内で作成されたカーソルの場合、トランザクション外で
getMore
を呼び出せません。
killCursors
コマンドをトランザクションの最初の操作に指定することはできません。さらに、トランザクション内で
killCursors
コマンドを実行すると、サーバーは指定されたカーソルを直ちに停止します。トランザクションがコミットされるのを待ちません。
次の操作はトランザクションでは許可されません。
クロスシャードの書き込みトランザクションで新しいコレクションを作成します。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。
コレクションの明示的な作成(
db.createCollection()
メソッドやインデックスの明示的な作成(db.collection.createIndexes()
およびdb.collection.createIndex()
メソッドなど)で、"local"
以外の読み取り保証(read concern)レベルを使用する場合listCollections
コマンドとlistIndexes
コマンド、およびそのヘルパー メソッド。その他の CRUD 操作や情報操作以外の操作、例えば
createUser
、getParameter
、count
などおよびその補助ツール。
トランザクションには、
transactionLifetimeLimitSeconds
で指定された有効期間の制限があります。デフォルトでは 60 秒です。
- 書き込み (write) コマンドのバッチ制限サイズ
100,000
書き込み (write) は、サーバーへの単一のリクエストで定義される、単一のバッチ 操作内で許可されます。
- ビュー
ビュー定義
pipeline
には$out
または$merge
ステージを含めることはできません。 ビュー定義にネストされたパイプラインが含まれている場合(たとえば、ビュー定義に$lookup
または$facet
ステージが含まれている場合)、この制限はネストされたパイプラインにも適用されます。ビューには、次の操作制限があります。
- プロジェクションの制限
$
-プレフィックスが付いたフィールドパス制限find()
およびfindAndModify()
プロジェクションでは、 DBRef フィールドを除き、$
で始まるフィールドをプロジェクションできません。たとえば、次の操作は無効です。db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } ) $
位置演算子の配置制限$
プロジェクション演算子は、フィールドパスの末尾にのみ使用できます(例:"field.$"
または"fieldA.fieldB.$"
)。例として、次の操作は無効です。解決するには、db.inventory.find( { }, { "instock.$.qty": 1 } ) $
プロジェクション演算子の後に続くフィールドパスのコンポーネントを削除してください。- 空のフィールド名に対するプロジェクション制限
find()
およびfindAndModify()
プロジェクションには、空のフィールド名のプロジェクションを含めることはできません。例として、次の操作は無効です。以前のバージョンでは、MongoDB は空のフィールドの包含/除外を、存在しないフィールドのプロジェクションと同様に扱っていました。db.inventory.find( { }, { "": 0 } ) - パスの不一致:埋め込みドキュメントとそのフィールド
- 埋め込みドキュメントのフィールドを使用して、埋め込みドキュメントをプロジェクトすることはできません。例として、
size
フィールドがあるドキュメントを含むコレクションinventory
を考えてみましょう。次の操作は、{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... } size
ドキュメントとsize.uom
フィールドの両方をプロジェクトしようとするためPath collision
エラーで失敗します。以前のバージョンでは、埋め込まれたドキュメントとそのフィールドの間で、最後に指定されたプロジェクションが適用されていました。db.inventory.find( {}, { size: 1, "size.uom": 1 } ) 埋め込みドキュメントのプロジェクションが、そのフィールドの任意のプロジェクションよりも後の場合、MongoDB は埋め込みドキュメントをプロジェクトします。たとえば、プロジェクション ドキュメント
{ "size.uom": 1, size: 1 }
はプロジェクション ドキュメント{ size: 1 }
と同じ結果を生成します。埋め込みドキュメントのプロジェクションが、そのフィールドのいずれかのプロジェクションよりも前の場合、MongoDB は指定されたフィールドをプロジェクションします。たとえば、プロジェクション ドキュメント
{ "size.uom": 1, size: 1, "size.h": 1 }
はプロジェクション ドキュメント{ "size.uom": 1, "size.h": 1 }
と同じ結果を生成します。
- パスの不一致:配列の
$slice
と埋め込みフィールド find()
およびfindAndModify()
プロジェクションには、配列の$slice
と配列に埋め込まれたフィールドの両方を含めることはできません。例として、配列フィールドinstock
を含むコレクションinventory
を考えます。次の操作は{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... } Path collision
エラーで失敗します。以前のバージョンでは、プロジェクションは両方のプロジェクションを適用し、db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } ) instock
配列の最初の要素($slice: 1
)を返しますが、プロジェクションされた要素のwarehouse
フィールドは非表示にされていました。MongoDB 4.4 以降で同じ結果を得るには、2 つの個別の$project
ステージでdb.collection.aggregate()
メソッドを使用します。$
位置演算子と$slice
制限find()
と プロジェクションには、findAndModify()
$slice
$
プロジェクション式の一部として プロジェクション式を含めることはできません。例として、次の操作は無効です。以前のバージョンでは、MongoDB はクエリ条件に一致するdb.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } ) instock
配列の最初の要素(instock.$
)を返します。つまり、位置プロジェクション"instock.$"
が優先され、$slice:1
の処理はありません。"instock.$": { $slice: 1 }
は他のドキュメント フィールドを除外しません。
セッション
- セッションと $external ユーザー名の制限
$external
認証ユーザー(Kerberos、LDAP、または x.509 ユーザー)でクライアント セッションと因果整合性の保証を使用するには、ユーザー名を 10k バイトより大きくすることはできません。
- セッション アイドル タイムアウト
30 分間、読み取りまたは書き込み操作が行われなかったセッション、またはこのしきい値内で
refreshSessions
を使用して更新されなかったセッションは期限切れとしてマークされ、MongoDB サーバーによりいつでも閉じられる可能性があります。セッションが閉じると、そのセッションに関連する進行中の操作や開いているカーソルもすべて終了されます。これには、noCursorTimeout()
または 30 分を超えるmaxTimeMS()
で構成されたカーソルが含まれます。db.collection.find()
を発行するアプリケーションを考えてみましょう。サーバーは、find()
のcursor.batchSize()
で定義されたドキュメントのバッチとともにカーソルを返します。セッションは、アプリケーションがサーバーに新しいドキュメントのバッチを要求するたびに更新されます。ただし、現在のドキュメントのバッチ処理に 30 分以上かかる場合、そのセッションは期限切れとしてマークされ、終了します。アプリケーションが次のドキュメントのバッチを要求すると、セッションの終了時にカーソルが強制終了されるため、サーバーはエラーを返します。カーソルを返す操作の場合、カーソルが 30 分以上アイドル状態になる可能性がある場合は、
Mongo.startSession()
を使用して明示的なセッション内で操作を発行し、refreshSessions
コマンドを使用して定期的にセッションを更新します。以下がその例です。var session = db.getMongo().startSession() var sessionId = session sessionId // show the sessionId var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout() var refreshTimestamp = new Date() // take note of time at operation start while (cursor.hasNext()) { // Check if more than 5 minutes have passed since the last refresh if ( (new Date()-refreshTimestamp)/1000 > 300 ) { print("refreshing session") db.adminCommand({"refreshSessions" : [sessionId]}) refreshTimestamp = new Date() } // process cursor normally } この操作例では、
db.collection.find()
メソッドは明示的なセッションに関連付けられています。カーソルにはnoCursorTimeout()
が構成されており、アイドル状態のときにサーバーがカーソルを閉じないようにしています。while
ループには、refreshSessions
を使用して 5 分ごとにセッションを更新するブロックが含まれています。セッションが 30 分のアイドル タイムアウトを超えることはないため、カーソルは開いたままになります。MongoDB ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。