Docs Menu
Docs Home
/
MongoDBマニュアル
/

MongoDB の制限としきい値

項目一覧

  • MongoDB Atlas の制限
  • BSON ドキュメント
  • 命名制限
  • 命名に関する警告
  • 名前空間
  • Indexes
  • ソート
  • データ
  • レプリカセット
  • シャーディングされたクラスター
  • 操作
  • セッション

このドキュメントでは、MongoDB システムのハード制限とソフト制限のコレクションを取り上げています。このページの制限は、特に指定がない限り、次のすべての環境でホストされる配置に適用されます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

次の制限は、MongoDB Atlas でホストされている配置にのみ適用されます。 これらの制限のいずれかが組織にとって問題となる場合は、 Atlas サポートにお問い合わせください。

コンポーネント
Limit

12

単一リージョン クラスターでのシャード

70

マルチリージョン クラスターのクロスリージョン ネットワーク権限

40 。 また、プロジェクト内のクラスターは40を超えるリージョンにまたがっている場合は、このプロジェクトでマルチリージョンクラスターを作成することはできません。

レプリカセットまたはシャードごとに選挙可能なノード

7

M30

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 のマルチクラウド配置にプライベート接続を経由して接続する場合、クラウドプロバイダーは接続元と同じノードにのみアクセスできます。このクラウドプロバイダーには、そのリージョンにプライマリノードがない場合があります。その場合、配置にアクセスするには、接続文字列でセカンダリの読み込み設定 (read preference) モードを指定する必要があります。

MongoDB Atlas をマルチクラウドに配置しており、すべてのノードに現在のプロバイダーからプライベート接続でアクセスする必要がある場合は、次のいずれかのアクションを実行します。

  • 現在のプロバイダーで残りの各プロバイダーへの VPN を構成します。

  • MongoDB Atlas へのプライベートエンドポイントは、残りのプロバイダーごとに設定します。

単一の MongoDB Atlas クラスター内のコレクションの数に厳密な制限はありませんが、多数のコレクションとインデックスを処理するとクラスターのパフォーマンスが低下する可能性があります。コレクションが大きいほど、パフォーマンスへの影響が大きくなります。

MongoDB Atlas クラスター階層ごとに推奨されるコレクションとインデックスの最大合計数は次のとおりです。

MongoDB Atlas Cluster Tier
推奨最大値

M10

5,000 コレクションとインデックス

M20 / M30

10,000 コレクションとインデックス

M40/+

100,000 コレクションとインデックス

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 が管理するグローバルクラスター プロジェクトあたり固有シャードキー数

M0 MongoDB Atlas プロジェクトあたりクラスター数

1

MongoDB Atlas サービスアカウントには、組織とプロジェクトに次の制限があります。

コンポーネント
Limit

MongoDB Atlas 組織ごとの Atlas サービスアカウント

200

MongoDB Atlas サービスアカウントごとのアクセス リスト エントリ

200

MongoDB Atlas サービスアカウントごとのシークレット数

2

MongoDB Atlas サービスアカウントあたりのアクティブなトークン数

100

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]12 組織名とプロジェクト名には Unicode 文字または数字、および句読点(-_.(),:&@+' を含めることができます。

MongoDB Atlas のサーバーレス インスタンス、無料クラスター、共有クラスターには、追加の制限が適用されます。詳細については、次のリソースを参照してください。

一部の MongoDB コマンドは MongoDB Atlas ではサポートされません。また、一部のコマンドは MongoDB Atlas の無料クラスターでのみサポートされます。詳細については、次のリソースを参照してください。

BSON ドキュメントのサイズ

BSON ドキュメントの最大サイズは 16 MB です。

ドキュメントの最大サイズを設定すると、単一ドキュメントが過大な量の RAM を使用したり、送信中に過大な量の帯域幅を使用したりする問題が軽減します。MongoDB では、最大サイズを超えるドキュメントは、GridFS API を使用して保存できます。GridFS の詳細については、「mongofiles」および使用しているドライバーのドキュメントを参照してください。

BSON ドキュメントのネストの深さ

MongoDB では、BSON ドキュメントで 100 レベル以下のネストがサポートされます。オブジェクトまたは配列ごとにレベルが追加されます。

データベース名での大文字と小文字の使用

データベース名は大文字と小文字を区別しません。そのため、salesDataSalesDataのような名前のデータベースを 2 つ使用することはできません。

MongoDB でデータベースを作成したら、そのデータベースを参照する際に一貫した大文字小文字の使用が必要です。例として、salesData データベースを作成する場合は、salesdataSalesDataのように大文字と小文字を入れ替えたものを使用しないよう注意してください。

Windows のデータベース名に関する制限

Windows で実行中の MongoDB の配置について、データベース名に次の文字は使えません。

/\. "$*<>:|?

また、データベース名に「null」の文字を含めることはできません。

Unix および Linux システムにおけるデータベース名の制限

Unix および Linux システムで実行中の MongoDB 配置の場合、データベース名に次の文字は使えません。

/\. "$

また、データベース名に「null」の文字を含めることはできません。

データベース名の長さ

データベース名は空にできず、 64 バイト未満である必要があります。

コレクション名の制限

コレクション名はアンダースコアまたは文字で始める必要があり、次のことはできません

  • $を含む。

  • 空の文字列である(例:"")。

  • 「null」の文字が含まれる。

  • system.で始まる。(内部で使用するため利用できません。)

  • .system.が含まれる。

コレクション名にアンダースコアなどの特殊文字が含まれている場合、または数字で始まる場合は、コレクションにアクセスするために、mongoshdb.getCollection() メソッドまたは ドライバーの同様のメソッドを使用します。

名前空間の長さ:

名前空間の長さは、シャーディングされていないコレクションとビューでは、255 バイト、シャーディングされたコレクションでは 235 バイトを上限とします。コレクションまたはビューの名前空間には、データベース名、ドット(.)セパレーター、コレクションまたはビューの名前(例: <database>.<collection>)が含まれます。

フィールド名に関する制限
  • フィールド名にnull文字を含めることはできません

  • サーバーでは、ドット(.)とドル記号($)を含むフィールド名を保存できます。

  • MongodB 5.0 では、フィールド名における($ )および(.)の使用に対するサポートが強化されました。制限事項がいくつかあります。詳細については、フィールド名の考慮事項を参照してください。

  • 各フィールド名はドキュメント内で一意である必要があります。 ドキュメントに重複フィールドがある場合、MongoDB CRUD操作が予期しない動作をする可能性があるため、重複フィールドを持つドキュメントを保存しないでください。

_idの制限

The field name _id is reserved for use as a primary key; its value must be unique in the collection, is immutable, and may be of any type other than an array or regex. _idにサブフィールドが含まれている場合、サブフィールド名は( $ )記号で始めることができません。

警告

このセクションで説明されている問題は、データの損失または破損につながる可能性があるため注意してください。

MongoDBクエリ言語はフィールド名が重複するドキュメントをサポートしていません。

  • BSONビルダによっては、重複するフィールド名を持つBSONドキュメントの作成をサポートしている場合がありますが、これらのドキュメントをMongoDBに挿入した場合、挿入が 成功したように見えても サポートされていません。

  • 例、 MongoDBドライバーを使用して重複しているフィールド名を持つBSONドキュメントを挿入すると、挿入前にドライバーが勝手に重複値を削除したり、重複フィールドを含む無効なドキュメントが挿入されたりする可能性があります。これらのドキュメントをクエリすると、結果が不整合になります。

  • アップデートが 成功したように見えても 、重複するフィールド名を持つドキュメントのアップデートはサポートされていません。

MongoDB6.1 validatefulltrue以降、ドキュメントに重複するフィールド名があるかどうかを確認するには、 フィールドを$objectToArray に設定して コマンドを使用します。いずれのMongoDBバージョンでも、ドキュメントに重複するフィールド名があるかどうかを確認するには、 集計演算子を使用します。

MongoDB 5.0 以降、ドキュメントフィールド名に接頭辞としてドル記号($)を付けたり、ピリオド(.)を含めたりすることができます。ただし、フィールド名にこれらの記号が使用されている場合、状況によっては mongoimportmongoexport が通常どおりに動作しないことがあります。

MongoDB Extended JSON v2では、型ラッパーと、型ラッパーと同じ名前を持つフィールドを区別できません。対応する BSON 表現にドル( $)で始まるキーが含まれる可能性があるコンテキストでは、拡張 JSON 形式を使用しないでください。DBRef メカニズムは、この一般ルールの例外です。

フィールド名にピリオド(.)が含まれる状態での mongoimportmongoexport の使用にも制限があります。CSV ファイルではデータ階層を表すのにピリオド(.)が使用されるため、フィールド名のピリオド(.)はネストのレベルと誤解されます。

ドル記号($)で始まるフィールド名や、ピリオド(.)を含むフィールド名を使用し、MongoDB 5.0 以前のサーバーで未確認の書き込み(書き込み確認(write concern)w=0)と組み合わせて使用すると、頻度は低いもののデータが失われる可能性があります。

insertupdate、およびfindAndModifyコマンドを実行すると、5.0 互換のドライバーは、ドル記号($)で始まるフィールド名またはピリオド( .)を含むフィールド名を持つドキュメントの使用に対する制限を解除します。これらのフィールド名は、以前のドライバー バージョンではクライアント側のエラーを引き起こしていました。

ドライバーが接続されているサーバー バージョンに関係なく、制限は解除されます。5.0 ドライバーが古いサーバーにドキュメントを送信すると、エラーを送信することなくドキュメントは拒否されます。

名前空間の長さ

名前空間の長さは、シャーディングされていないコレクションとビューでは、255 バイト、シャーディングされたコレクションでは 235 バイトを上限とします。コレクションまたはビューの名前空間には、データベース名、ドット(.)セパレーター、コレクションまたはビューの名前(例: <database>.<collection>)が含まれます。

Tip

以下も参照してください。

コレクションあたりのインデックス数

1 つのコレクションで保有できるインデックスは 64 個までです。

複合インデックス内のインデックス付きフィールドの数

複合インデックスには 32 を超えるフィールドを含めることはできません。

クエリでは、テキスト インデックスと地理空間インデックスを併せて使用できません

特殊な テキスト インデックス を必要とする$textクエリと、異なるタイプの特殊なインデックスを必要とするクエリ演算子を組み合わせることはできません。例として、$textクエリと$near演算子を組み合わせることはできません。

2dsphere インデックスを持つフィールドにはジオメトリのみを保持できます

2dsphere インデックスを持つフィールドには、座標ペアまたは GeoJSON データの形式でジオメトリ データを格納する必要があります。2dsphereインデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに 2dsphere インデックスを構築しようとしたりすると、操作は失敗します。

Tip

以下も参照してください。

シャーディング操作制限におけるユニークインデックスの制限。

2dsphere インデックス キーの個数制限

2dsphere インデックスのキーを生成するために、mongodGeoJSON シェイプを内部表現にマッピングします。結果として得られる内部表現は、値の大きな配列になる可能性があります。

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 に対してこの制限を高く設定しすぎると、メモリが不足し、サーバーがシャットダウンする可能性があります。

インデックス構築は、createIndexesなどのユーザー コマンドまたは最初の同期などの管理プロセスによって開始される場合があります。どちらもmaxIndexBuildMemoryUsageMegabytesで設定された制限の対象となります。

最初の同期では一度に 1 つのコレクションのみが取り込まれるため、メモリ制限を超えるリスクはありません。ただし、ユーザーが複数のデータベース内の複数のコレクションに対して同時にインデックス構築を開始し、maxIndexBuildMemoryUsageMegabytesで設定された制限以上のメモリを消費する可能性があります。

Tip

レプリカセットおよびレプリカセット シャードを含むシャーディングされたクラスターへのインデックス構築の影響を最小限に抑えるには、「レプリカセットでのローリング インデックス構築」で説明されているローリング インデックス構築手順を使用してください。

照合順序とインデックスの種類

次のインデックス タイプは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。

Tip

単純ではない照合順序を持つコレクションに text または 2d インデックスを作成するには、インデックスの作成時、明確に {collation: {locale: "simple"} } を指定する必要があります。

Hidden Indexes
ソートキーの最大数
  • 最大 32 個のキーでソートすることができます。

  • 重複するフィールドを含むソート パターンを指定すると、エラーが発生します。

上限付きコレクション内の最大ドキュメント数

createmaxパラメーターを使用して、上限付きコレクション内のドキュメントの最大数を指定する場合、その値は 2 31ドキュメント未満である必要があります。

上限付きコレクションの作成時にドキュメントの最大数を指定しない場合、ドキュメント数の制限はありません。

レプリカセットのノード数

レプリカセットには最大 50 ノードを含めることができます。

レプリカセットの投票ノード数

レプリカセットには最大 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 は単一のフィールドではなく、キー全体に対して一意性を強制します。

Tip

次を参照してください。

代替アプローチについては、任意のフィールドに対するユニークな制約を参照してください。

移行する範囲あたりのドキュメントの最大数

デフォルトでは、範囲内のドキュメント数が、構成された範囲サイズを平均ドキュメントサイズで割った結果の 2 倍を超える場合、MongoDB は範囲を移動できません。MongoDB でチャンクのサブ範囲を移動して、サイズをその結果より小さくできる場合、バランサーは範囲を移行することで移動できます。db.collection.stats() には、コレクション内の平均ドキュメント サイズを表す avgObjSize のフィールドが含まれます。

大きすぎて移行できないチャンクの場合は次のようになります。

  • バランサー設定の attemptToBalanceJumboChunks では、チャンクにjumboというラベルが付いていない限り、バランサーが大きすぎて移動できないチャンクを移行できます。詳細については、「サイズ制限を超えるバランス範囲」を参照してください。

    moveRangemoveChunk コマンドを発行するときに、移動できないほど大きい範囲の移行を可能にするために forceJumbo オプションを指定できます。その範囲にはジャンボというラベルが付いている場合と付いていない場合があります。

シャードキー インデックスの種類

シャードキー インデックスは、シャードキーの昇順インデックス、シャードキーで始まりシャードキーの昇順を指定する複合インデックス、またはハッシュインデックスにすることができます。

シャードキー インデックスは、以下のようにはできません。

シャードキー選択

シャードキーを変更するためのオプションは、実行している MongoDB のバージョンによって異なります。

単調に増加するシャードキーは挿入スループットを制限する可能性があります

挿入量が多いクラスターでは、単調に増加したり減少したりするシャードキーが挿入スループットに影響を与える可能性があります。シャードキーが_idフィールドである場合、 _idフィールドのデフォルト値は一般に増加する値を持つ ObjectId であることに注意してください。

単調に増加するシャードキーを持つドキュメントを挿入する場合、挿入されたすべてのドキュメントは単一のシャード上の同じチャンクに属します。最終的に、システムがすべての書き込み操作を受けるチャンク範囲を分割し、その内容を移行してデータをより均等に分散させます。ただし、クラスターは常に挿入操作を単一のシャードにのみ指示するため、挿入スループットのボトルネックが生じます。

クラスターでの操作が主に読み取り操作と更新である場合、この制限はクラスターに影響しない可能性があります。

この制約を回避するには、ハッシュされたシャードキーを使用するか、単調に増加または減少しないフィールドを選択します。

ハッシュされたシャードキーハッシュされたインデックスには、昇順の値を持つキーのハッシュが格納されます。

ソート操作

MongoDB は、1 つまたは複数のインデックスを使用してソート順序を取得できない場合、データに対してブロッキングソート操作を実行する必要があります。この名前は、SORT ステージが出力ドキュメントを返す前にすべての入力ドキュメントを読み取り、その特定のクエリのデータフローをブロックするという要件に由来しています。

MongoDB でのブロッキング ソート操作に 100 メガバイトを超えるシステム メモリが必要な場合、クエリが cursor.allowDiskUse()指定していない限り、MongoDB はエラーを返します。allowDiskUse() を指定することで、MongoDB は 100 メガバイトのシステムメモリ制限を超えるデータをディスク上の一時ファイルに保存し、ブロッキングソート操作を処理することができます。

ソートとインデックスの使用の詳細については、「ソートとインデックスの使用」を参照してください。

集計パイプライン ステージ

MongoDBは、単一のパイプラインで許可される集計パイプラインステージの数を 1000 に制限します。

集計パイプラインが解析される前または解析された後に ステージの制限を超えると、エラーが発生します。

集計パイプライン メモリ

MongoDB 6.0 以降のバージョンでは、実行に 100 MB を超えるメモリを必要とするパイプライン ステージが、デフォルトで一時ファイルをディスクに書き込むかどうかをallowDiskUseByDefaultパラメーターが制御します。

  • allowDiskUseByDefaulttrueに設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージは、デフォルトで一時ファイルをディスクに書き込みます。{ allowDiskUse: false }オプションを使用して、特定のfindまたはaggregateコマンドの一時ファイルのディスクへの書き込みを無効にすることができます。

  • allowDiskUseByDefaultfalseに設定されている場合、実行に 100 MB を超えるメモリを必要とするパイプライン ステージでは、デフォルトでエラーが発生します。{ allowDiskUse: true }オプションを使用して、特定のfindまたはaggregateの一時ファイルのディスクへの書き込みを有効にすることができます。

$search 集計ステージは別のプロセスで実行されるため、 RAM の 100 メガバイトに制限されません。

allowDiskUsetrue の場合に一時ファイルをディスクに書き込むことができるステージの例は次のとおりです。

注意

パイプライン ステージはドキュメントのストリームに対して動作し、各パイプライン ステージはドキュメントを取り込んで処理し、その結果となるドキュメントを出力します。

一部のステージでは、受信したドキュメントをすべて処理するまでドキュメントを出力できません。これらのパイプライン ステージは、すべての受信ドキュメントが処理されるまで、ステージ出力を 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 地理空間クエリでは $or 演算子を使用できません。

Tip

次を参照してください。

地理空間クエリ

球状データのクエリに 2d インデックスを使用すると、誤った結果やエラーが返されることがあります。たとえば、2d インデックスでは、北極と南極が入っている球面クエリはサポートされていません。

地理空間座標
  • 有効な経度の値は、-180 以上、180 以下です。

  • 有効な緯度の値は-90 以上、90 以下です。

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 を呼び出せません。

次の操作はトランザクションでは許可されません。

  • クロスシャードの書き込みトランザクションで新しいコレクションを作成します。たとえば、あるシャードで既存コレクションに書き込み、別のシャードで暗示的にコレクションを作成する場合、MongoDB では同じトランザクションで両方の操作を実行できません。

  • コレクションの明示的な作成db.createCollection()メソッドやインデックスの明示的な作成(db.collection.createIndexes() および db.collection.createIndex() メソッドなど)で、"local" 以外の読み取り保証(read concern)レベルを使用する場合

  • listCollections コマンドと listIndexes コマンド、およびそのヘルパー メソッド。

  • その他の CRUD 操作や情報操作以外の操作、例えば createUsergetParametercount などおよびその補助ツール。

  • 並列操作。複数の名前空間を同時に更新するには、代わりにbulkWrite コマンドの使用を検討してください。

トランザクションには、transactionLifetimeLimitSecondsで指定された有効期間の制限があります。デフォルトでは 60 秒です。

書き込み (write) コマンドのバッチ制限サイズ

100,000 書き込み (write) は、サーバーへの単一のリクエストで定義される、単一のバッチ 操作内で許可されます。

mongoshBulk() 操作と、ドライバーの同等のメソッドには、この制限はありません。

ビュー

ビュー定義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()プロジェクションには、空のフィールド名のプロジェクションを含めることはできません。例として、次の操作は無効です。
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 ユーザー)でクライアント セッションと因果整合性の保証を使用するには、ユーザー名を 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 ドライバーの場合、セッションを作成するための手順と構文については、ドライバーのドキュメントを参照してください。

戻る

ログ メッセージ