このドキュメントでは、MongoDB システムのハード制限とソフト制限のコレクションを取り上げています。このページの制限は、特に指定がない限り、次のすべての環境でホストされる配置に適用されます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
MongoDB Atlas の制限
次の制限は、MongoDB Atlas でホストされている配置にのみ適用されます。 これらの制限のいずれかが組織にとって問題となる場合は、 Atlas サポートにお問い合わせください。
MongoDB Atlas クラスターの制限
コンポーネント | Limit |
|---|---|
マルチリージョンクラスター内のシャード | 12 |
単一リージョン クラスターでのシャード | 70 |
マルチリージョン クラスターのクロスリージョン ネットワーク権限 | 40 。 また、プロジェクト内のクラスターは40を超えるリージョンにまたがっている場合は、このプロジェクトでマルチリージョンクラスターを作成することはできません。 |
レプリカセットまたはシャードごとに選挙可能なノード | 7 |
コンフィギュレーションサーバーのクラスター階層(最小値および最大値) |
|
MongoDB Atlas の接続制限とクラスター階層
MongoDB Atlas は、クラスター階層とクラスに基づいて同時着信接続数を制限します。MongoDB Atlas の接続制限はノードごとに適用されます。シャーディングされたクラスターの場合、MongoDB Atlas の接続制限は mongos ルーターごとに適用されます。mongos ルーターの数は、すべてのシャードのレプリカセットのノードの数と同じです。
読み込み設定(read preference)も、 MongoDB Atlas が特定のクエリに割り当てることができる接続の合計数に影響します。
MongoDB Atlas では、指定クラスター階層に対して次の接続制限が設けられています。
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
|---|---|
| 500 |
| 500 |
| 500 |
| 1500 |
| 3000 |
| 3000 |
| 6000 |
| 16000 |
| 32000 |
| 96000 |
| 96000 |
| 128000 |
| 128000 |
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
|---|---|
| 4000 |
| 16000 |
| 32000 |
| 64000 |
| 96000 |
| 128000 |
| 128000 |
| 128000 |
| 128000 |
MongoDB Atlas Cluster Tier | ノードあたりの最大接続数 |
|---|---|
| 500 |
| 500 |
| 500 |
| 1500 |
| 3000 |
| 3000 |
| 6000 |
| 16000 |
| 32000 |
| 64000 |
| 96000 |
| 128000 |
| 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 | 推奨最大値 |
|---|---|
| 5,000 コレクションとインデックス |
| 10,000 コレクションとインデックス |
| 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 マネージド シャーディングを持つグローバルクラスターにのみ適用されます。 自己管理型シャーディングを持つグローバルクラスターのプロジェクトごとの固有のシャードキーの数に制限はありません。 |
| 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] |
|
プロジェクト名 | 64 |
|
組織名 | 64 |
|
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 ドキュメントを挿入すると、挿入前にドライバーが勝手に重複値を削除したり、重複フィールドを含む無効なドキュメントが挿入されたりする可能性があります。このようなドキュメントに対してクエリを実行すると、無作為で一貫性のない結果になります。
あいまいなフィールド名を回避
埋め込みフィールドのドット表記と同じ名フィールド名は使用しないでください。埋め込みフィールド { "a" : { "b": ... } } を持つドキュメントがある場合、そのコレクション内の他のドキュメントはトップレベルフィールド "a.b" を保持してはいけません。
埋め込みフィールドと最上位フィールドを同じ方法で参照できる場合、インデックス作成とシャーディング操作は埋め込みフィールドの で行われます。同じ方法で参照埋め込みフィールドがコレクションにある間は、最上位フィールド"a.b" のインデックスやシャードはできません。
例、コレクションに埋め込みフィールド{ "a" : { "b": ... } } と最上位フィールド"a.b" の両方を持つドキュメントが含まれている場合、インデックス作成とシャーディング操作は埋め込みフィールドの で実行されます。コレクションに埋め込みフィールド{ "a" : { "b": ... } } も含まれている場合、最上位フィールド"a.b" のインデックスまたはシャードは実行できません。
ドル記号($)とピリオド(.)に関するインポートとエクスポートの問題
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>)、Tip
Indexes
- クエリでは、テキスト インデックスと地理空間インデックスを併せて使用できません
特殊な テキスト インデックス を必要とする
$textクエリと、異なるタイプの特殊なインデックスを必要とするクエリ演算子を組み合わせることはできません。例として、$textクエリと$near演算子を組み合わせることはできません。
- 2dsphere インデックスを持つフィールドにはジオメトリのみを保持できます
2dsphere インデックスを持つフィールドには、座標ペアまたは GeoJSON データの形式でジオメトリ データを格納する必要があります。
2dsphereインデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphereインデックスを構築しようとしたりすると、操作は失敗します。Tip
シャーディング操作制限におけるユニークインデックスの制限。
- 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,768
65,536
131,072
262,144
最大コレクション サイズ( 64 MB チャンク サイズ)
1 TB
2 TB
4 TB
8 TB
最大コレクション サイズ( 128 MB チャンク サイズ)
2 TB
4 TB
8 TB
16 TB
最大コレクション サイズ( 256 MB チャンク サイズ)
4 TB
8 TB
16 TB
32 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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。