MongoDB の制限としきい値
このドキュメントでは、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 |
250 | |
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 プロジェクトあたり | 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 文字または数字、および句読点(-_.(),:&@+' を含めることができます。 |
Serverless Instance, Free Cluster, M2 and M5 Cluster, and Flex Cluster Limitations
Additional limitations apply to MongoDB Atlas serverless instances, free clusters, M2, M5, and Flex clusters. To learn more, see the following resources:
MongoDB Atlas コマンドの制限
一部の MongoDB コマンドは MongoDB Atlas ではサポートされません。また、一部のコマンドは MongoDB Atlas の無料クラスターでのみサポートされます。詳細については、次のリソースを参照してください。
BSON ドキュメント
- BSON ドキュメントのサイズ
BSONドキュメントの最大サイズは 16 メガバイトです。
ドキュメントの最大サイズを設定すると、単一ドキュメントが過大な量の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()
メソッドまたは ドライバーの同様のメソッドを使用します。
名前空間の長さ:
名前空間の長さは、シャーディングされていないコレクションとビューでは、255 バイト、シャーディングされたコレクションでは 235 バイトを上限とします。コレクションまたはビューの名前空間には、データベース名、ドット(
.
)セパレーター、コレクションまたはビューの名前(例:<database>.<collection>
)が含まれます。
- フィールド名に関する制限
フィールド名に
null
文字を含めることはできません。
サーバーでは、ドット(
.
)とドル記号($
)を含むフィールド名を保存できます。MongodB 5.0 では、フィールド名における(
$
)および(.
)の使用に対するサポートが強化されました。制限事項がいくつかあります。詳細については、フィールド名の考慮事項を参照してください。各フィールド名はドキュメント内で一意である必要があります。 ドキュメントに重複フィールドがある場合、MongoDB CRUD操作が予期しない動作をする可能性があるため、重複フィールドを持つドキュメントを保存しないでください。
命名に関する警告
警告
このセクションで説明されている問題は、データの損失または破損につながる可能性があるため注意してください。
MongoDB は重複するフィールド名をサポートしていません。
MongoDBクエリ言語はフィールド名が重複するドキュメントをサポートしていません。
BSONビルダによっては、重複するフィールド名を持つBSONドキュメントの作成をサポートしている場合がありますが、これらのドキュメントをMongoDBに挿入した場合、挿入が 成功したように見えても サポートされていません。
例、 MongoDBドライバーを使用して重複しているフィールド名を持つBSONドキュメントを挿入すると、挿入前にドライバーが勝手に重複値を削除したり、重複フィールドを含む無効なドキュメントが挿入されたりする可能性があります。 これらのドキュメントをクエリすると、結果が不整合になります。
アップデートが 成功したように見えても 、重複するフィールド名を持つドキュメントのアップデートはサポートされていません。
MongoDB6.1 以降、ドキュメントに重複するフィールド名があるかどうかを確認するには、validate
full
フィールドを に設定してtrue
コマンドを使用します。いずれのMongoDBバージョンでも、ドキュメントに重複するフィールド名があるかどうかを確認するには、$objectToArray
集計子を使用します。
Avoid Ambiguous Field Names
Do not use a field name that is the same as the
ドット表記 for an
embedded field. If you have a document with an embedded field
{ "a" : { "b": ... } }
, other documents in that collection should
ではない have a top-level field "a.b"
.
If you can reference an embedded field and a top-level field in the same
way, indexing and sharding operations happen on the embedded field.
You cannot index or shard on the top-level field "a.b"
while the
collection has an embedded field that you reference in the same way.
For example, if your collection contains documents with both an embedded
field { "a" : { "b": ... } }
and a top-level field "a.b"
,
indexing and sharding operations happen on the embedded field. It is not
possible to index or shard on the top-level field "a.b"
when your
collection also contains an embedded field { "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 ドライバーが古いサーバーにドキュメントを送信すると、エラーを送信することなくドキュメントは拒否されます。
名前空間
Indexes
- クエリでは、テキスト インデックスと地理空間インデックスを併せて使用できません
特殊な テキスト インデックス
を必要とする
$text
クエリと、異なるタイプの特殊なインデックスを必要とするクエリ演算子を組み合わせることはできません。例として、$text
クエリと$near
演算子を組み合わせることはできません。
- 2dsphere インデックスを持つフィールドにはジオメトリのみを保持できます
2dsphere インデックスを持つフィールドには、座標ペアまたは GeoJSON データの形式でジオメトリ データを格納する必要があります。
2dsphere
インデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphere
インデックスを構築しようとしたりすると、操作は失敗します。以下も参照してください。
シャーディング操作制限におけるユニークインデックスの制限。
- 2dsphere インデックス キーの個数制限
2dsphere インデックスのキーを生成するために、
mongod
は GeoJSON シェイプを内部表現にマッピングします。結果として得られる内部表現は、値の大きな配列になる可能性があります。mongod
が配列を保持するフィールドにインデックス キーを生成する場合、mongod
は配列要素ごとにインデックス キーを生成します。複合インデックスの場合、mongod
は各フィールドに対して生成されたキーセットの直積集合を計算します。両方のセットが大きい場合、直積集合の計算によって操作がメモリ制限を超える可能性があります。indexMaxNumGeneratedKeysPerDocument
は、メモリ不足エラーを防ぐために、単一のドキュメントに対して生成されるキーの最大数を制限します。デフォルトは 1 ドキュメントあたり 100000 インデックス キーです。制限を引き上げることは可能ですが、indexMaxNumGeneratedKeysPerDocument
パラメーターで指定された数より多くのキーが操作に必要な場合、操作は失敗します。
- WiredTiger ストレージエンジンによって対象クエリから返される NaN 値は、常に double 型です
インデックスによってカバーされているクエリから返されるフィールドの値が
NaN
の場合、そのNaN
値の型は常にdouble
になります。
- Multikey Index
マルチキー インデックスは、配列フィールドに対するクエリをサポートしていません。
- 地理空間インデックス
地理空間インデックスは、クエリをカバーできません。
- インデックス構築におけるメモリ使用量
createIndexes
は、コレクションに 1 つ以上のインデックスの構築をサポートしています。createIndexes
はメモリとディスク上の一時ファイルの組み合わせを使用してインデックス構築を完了します。createIndexes
のメモリ使用量のデフォルト制限は200メガバイトで、単一のcreateIndexes
コマンドを使用してビルドされたすべてのインデックスに共有されます。 メモリ制限に達すると、createIndexes
は--dbpath
ディレクトリ内の
_tmp
という名前のサブディレクトリにある一時ディスク ファイルを使用してビルドを完了します。
maxIndexBuildMemoryUsageMegabytes
サーバー パラメータを設定することで、メモリ制限を上書きできます。メモリ制限を高く設定すると、より早くインデックス構築を完了できる可能性があります。ただし、システム上の未使用 RAM に対してこの制限を高く設定しすぎると、メモリが不足し、サーバーがシャットダウンする可能性があります。機能の互換性バージョン (fcv)
"4.2"
以降では、インデックス構築でのメモリ制限がすべてのインデックス構築に適用されます。
インデックス構築は、
createIndexes
などのユーザー コマンドまたは最初の同期などの管理プロセスによって開始される場合があります。どちらもmaxIndexBuildMemoryUsageMegabytes
で設定された制限の対象となります。最初の同期では一度に 1 つのコレクションのみが取り込まれるため、メモリ制限を超えるリスクはありません。ただし、ユーザーが複数のデータベース内の複数のコレクションに対して同時にインデックス構築を開始し、
maxIndexBuildMemoryUsageMegabytes
で設定された制限以上のメモリを消費する可能性があります。Tip
レプリカセットおよびレプリカセット シャードを含むシャーディングされたクラスターへのインデックス構築の影響を最小限に抑えるには、「レプリカセットでのローリング インデックス構築」で説明されているローリング インデックス構築手順を使用してください。
- 照合順序とインデックスの種類
次のインデックス タイプは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。
Tip
単純ではない照合順序を持つコレクションに
text
または2d
インデックスを作成するには、インデックスの作成時、明確に{collation: {locale: "simple"} }
を指定する必要があります。
- Hidden Indexes
_id
インデックスは非表示にできません。
非表示のインデックス
では
hint()
を使用できません。
ソート
データ
- 上限付きコレクション内の最大ドキュメント数
create
のmax
パラメーターを使用して、上限付きコレクション内のドキュメントの最大数を指定する場合、その値は 2 31ドキュメント未満である必要があります。上限付きコレクションの作成時にドキュメントの最大数を指定しない場合、ドキュメント数の制限はありません。
レプリカセット
- レプリカセットの投票ノード数
レプリカセットには最大 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
で実行すると、インデックスにシャードキーが含まれている場合にのみ、シャーディングされたコレクションのクエリをカバーできます。
- シャーディングされたコレクションにおける単一ドキュメントの変更操作
justOne
または
multi: false
オプションを指定するシャーディングされたコレクションに対して
update
および
remove()
操作を使用するには以下に従ってください。
1つのシャードのみをターゲットにする場合は、クエリ仕様で部分的なシャードキーを使用するか、
クエリ仕様でシャードキーまたは
_id
フィールドを指定できます。
- シャーディングされたコレクションにおけるユニークインデックス
MongoDB は、ユニークインデックスにインデックスのプレフィックスとして完全なシャードキーが含まれている場合を除き、シャード間のユニークインデックスをサポートしていません。このような状況では、MongoDB は単一のフィールドではなく、キー全体に対して一意性を強制します。
- 移行する範囲あたりのドキュメントの最大数
デフォルトでは、範囲内のドキュメント数が、構成された範囲サイズを平均ドキュメントサイズで割った結果の 2 倍を超える場合、MongoDB は範囲を移動できません。MongoDB でチャンクのサブ範囲を移動して、サイズをその結果より小さくできる場合、バランサーは範囲を移行することで移動できます。
db.collection.stats()
には、コレクション内の平均ドキュメント サイズを表すavgObjSize
のフィールドが含まれます。大きすぎて移行できないチャンクの場合は次のようになります。
バランサー設定の
attemptToBalanceJumboChunks
では、チャンクにjumboというラベルが付いていない限り、バランサーが大きすぎて移動できないチャンクを移行できます。詳細については、「サイズ制限を超えるバランス範囲」を参照してください。moveRange
とmoveChunk
コマンドを発行するときに、移動できないほど大きい範囲の移行を可能にするために forceJumbo オプションを指定できます。その範囲にはジャンボというラベルが付いている場合と付いていない場合があります。
シャードキーの制限
- シャードキー インデックスの種類
シャードキー インデックスは、シャードキーの昇順インデックス、シャードキーで始まりシャードキーの昇順を指定する複合インデックス、またはハッシュインデックスにすることができます。
シャードキー インデックスは、以下のようにはできません。
- シャードキー選択
シャードキーを変更するためのオプションは、実行している MongoDB のバージョンによって異なります。
MongoDB 5.0 以降では、ドキュメントのシャードキーを変更することでコレクションの再シャーディングが可能です。
既存のシャードキーにサフィックス フィールドを追加することで、シャードキーを調整できます。
- 単調に増加するシャードキーは挿入スループットを制限する可能性があります
挿入量が多いクラスターでは、単調に増加したり減少したりするシャードキーが挿入スループットに影響を与える可能性があります。シャードキーが
_id
フィールドである場合、_id
フィールドのデフォルト値は一般に増加する値を持つ ObjectId であることに注意してください。単調に増加するシャードキーを持つドキュメントを挿入する場合、挿入されたすべてのドキュメントは単一のシャード上の同じチャンクに属します。最終的に、システムがすべての書き込み操作を受けるチャンク範囲を分割し、その内容を移行してデータをより均等に分散させます。ただし、クラスターは常に挿入操作を単一のシャードにのみ指示するため、挿入スループットのボトルネックが生じます。
クラスターでの操作が主に読み取り操作と更新である場合、この制限はクラスターに影響しない可能性があります。
この制約を回避するには、ハッシュされたシャードキーを使用するか、単調に増加または減少しないフィールドを選択します。
ハッシュされたシャードキーとハッシュされたインデックスには、昇順の値を持つキーのハッシュが格納されます。
操作
- ソート操作
MongoDB は、1 つまたは複数のインデックスを使用してソート順序を取得できない場合、データに対してブロッキングソート操作を実行する必要があります。この名前は、
SORT
ステージが出力ドキュメントを返す前にすべての入力ドキュメントを読み取り、その特定のクエリのデータフローをブロックするという要件に由来しています。MongoDB でのブロッキング ソート操作に 100 メガバイトを超えるシステム メモリが必要な場合、クエリが
cursor.allowDiskUse()
を指定していない限り、MongoDB はエラーを返します。
allowDiskUse()
を指定することで、MongoDB は 100 メガバイトのシステムメモリ制限を超えるデータをディスク上の一時ファイルに保存し、ブロッキングソート操作を処理することができます。ソートとインデックスの使用の詳細については、「ソートとインデックスの使用」を参照してください。
- 集計パイプライン ステージ
MongoDBは、単一のパイプラインで許可される集計パイプラインステージの数を 1000 に制限します。
集計パイプラインが解析される前または解析された後に ステージの制限を超えると、エラーが発生します。
- 集計パイプライン メモリ
MongoDB 6.0 以降のバージョンでは、実行に 100 MB を超えるメモリを必要とするパイプライン ステージが、デフォルトで一時ファイルをディスクに書き込むかどうかを
allowDiskUseByDefault
パラメーターが制御します。allowDiskUseByDefault
がtrue
に設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージは、デフォルトで一時ファイルをディスクに書き込みます。{ allowDiskUse: false }
オプションを使用して、特定のfind
またはaggregate
コマンドの一時ファイルのディスクへの書き込みを無効にすることができます。allowDiskUseByDefault
がfalse
に設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージでは、デフォルトでエラーが発生します。{ allowDiskUse: true }
オプションを使用して、特定のfind
またはaggregate
の一時ファイルのディスクへの書き込みを有効にすることができます。
$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
ステージを含めることはできません。
- 地理空間クエリ
球状データのクエリに
2d
インデックスを使用すると、誤った結果やエラーが返されることがあります。たとえば、2d
インデックスでは、北極と南極が入っている球面クエリはサポートされていません。
- GeoJSON ポリゴンの面積
$geoIntersects
または$geoWithin
の場合、単一の半球よりも大きい面積を持つ単一リングのポリゴンを指定する場合は、$geometry
式にカスタム MongoDB 座標参照システムを含めます。それ以外の場合、補完ジオメトリに対して$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
などおよびその補助ツール。並列操作。複数の名前空間を同時に更新するには、
bulkWrite
コマンドの使用を検討してください。
トランザクションには、
transactionLifetimeLimitSeconds
で指定された有効期間の制限があります。デフォルトでは 60 秒です。
- 書き込み (write) コマンドのバッチ制限サイズ
100,000
の書き込み (write) は、サーバーへの単一のリクエストで定義される、1 つのバッチ操作で許可されます。
- ビュー
ビュー定義
pipeline
には、$out
または$merge
ステージを含めることはできません。この制限は、$lookup
ステージまたは$facet
ステージで使用されるパイプラインなどの埋め込みパイプラインにも適用されます。ビューには、次の操作制限があります。
ビューは読み取り専用です。
ビューの名前を変更することはできません。
ビューに対する
find()
操作では、次のクエリ 演算子およびプロジェクション 演算子をサポートしていません。ビューは
$text
をサポートしていません。ビューでは map-reduce 操作をサポートしていません。
- プロジェクションの制限
$
-プレフィックスが付いたフィールドパス制限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()
プロジェクションには、空のフィールド名のプロジェクションを含めることはできません。例として、次の操作は無効です。db.inventory.find( { }, { "": 0 } ) 以前のバージョンでは、MongoDB は空のフィールドの包含/除外を、存在しないフィールドのプロジェクションと同様に扱っていました。- パスの不一致:埋め込みドキュメントとそのフィールド
- 埋め込みドキュメントのフィールドを使用して、埋め込みドキュメントをプロジェクトすることはできません。例として、
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
$
プロジェクション式の一部として プロジェクション式を含めることはできません。例として、次の操作は無効です。db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } ) 以前のバージョンでは、MongoDB はクエリ条件に一致するinstock
配列の最初の要素(instock.$
)を返します。つまり、位置プロジェクション"instock.$"
が優先され、$slice:1
の処理はありません。"instock.$": { $slice: 1 }
は他のドキュメント フィールドを除外しません。
セッション
- セッションと $external ユーザー名の制限
$external
認証ユーザー(Kerberos、LDAP、または X.509 ユーザー)でクライアント セッションと因果整合性の保証を使用するには、ユーザー名を10 k バイトより大きくすることはできません。
- セッション アイドル タイムアウト
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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。