MongoDB の最大ドキュメントサイズ
このチュートリアルでは、MongoDB にドキュメントを保存するためのデフォルトの最大サイズ制限について説明します。また、データがサイズ制限を超えた場合の代替ソリューションについても説明します。
また、BSON ドキュメントのデフォルトの最大サイズ制限の効率的な使用についても学習します。
MongoDB の最大ドキュメントサイズ
MongoDB では、ドキュメント(オブジェクト)は BSON 形式で保存されます。BSON(バイナリ JSON
)は、JSON のようなドキュメントのバイナリシリアル化です。
この形式を使用すると、さまざまな拡張機能を使用して、JSON の一部ではないデータタイプのさまざまな表現を使用できます。
たとえば、BSON には JSON では使用できない Date
および BinData
タイプがあります。MongoDB ドキュメントによると、単一の BSON ドキュメントのサイズ制限は 16MB
です。
1つのドキュメントが送信中に無制限の量の RAM または帯域幅を使用できないようにするために、ドキュメントの最大サイズ制限があります。各アレイ/オブジェクトが 1つのレベルを追加する場合、最大 100 レベルの BSON ドキュメントをネストできることに注意してください。
今日の世界では、私たちの周りにデータがあります。そのため、データによって BSON ドキュメントのサイズ制限が 16 メガバイト増加する可能性があります。
その場合、MongoDB は、16MB
より大きいドキュメントを格納するための GridFS
API を提供することで私たちを支援します。
GridFS
API とは何ですか
GridFS
は MongoDB 仕様であり、オーディオ、ビデオ、画像ファイルなど、BSON ドキュメントの制限(16MB
)を超える大きなファイルを保存してアクセスするために使用できます。ファイルを保存するためのファイルシステムに似ていますが、データは MongoDB コレクションに保存されます。
GridFS
API は、ファイルをチャンクに分割し、すべてのデータチャンクを個別のドキュメントに格納します。各ドキュメントのサイズは 255KB
です。GridFS
には、デフォルトで fs.files
と fs.chunks
の 2つのコレクションが含まれ、ファイルのメタデータとチャンクが格納されます。
すべてのチャンクは一意の _id
(ObjectId
)フィールドによって認識され、fs.files
は親ドキュメントとして機能します。fs.chunks
ドキュメントの files_id
フィールドは、チャンクをその親にリンクします。
この記事を読んで、GridFS
を使用しながら構文を理解することができます。
デフォルトの BSON ドキュメントサイズ制限を効率的に使用する
BSON ドキュメントのサイズ制限(16MB
)はたくさんあります。たとえば、War of the Worlds
の非圧縮テキスト全体は 364k
(HTML)のみですが、例外は常に存在します。
データが制限を超えている場合は、前に説明した GridFS
API を使用するか、16MB
を効率的に使用するための戦略を立てることができます。
XYZ アプリケーションを開発するシナリオを考えてみましょう。アプリケーションには、Booleans
、numbers
、strings
、dates
(UNIX ミリ秒として表される)の 4つのデータタイプが必要です。
16MB
のサイズ制限により、MongoDB は約 200 万の 64 ビット
の数値(日付
とブール値
も)を簡単に保存できます。
ここでは、すべての UTF-8 文字が 1つのバイト
を占めるため、文字列
タイプの値には特別な注意が必要です。文字列
タイプの値を含むすべての列のサイズを最適化する必要があります。
文字列
タイプの値を持つ列のサイズを小さくするには、次の方法を試すことができます。
-
stringify()
およびzip()
メソッドをzip(JSON.stringify(column.values));
として使用できます。 -
辞書を作成し、すべての一意の
文字列
タイプの値を辞書に挿入できます。次に、文字列値をインデックスに置き換えます。このアプローチは、フィールドに繰り返し文字列値が多数ある場合に役立ちます。この方法は、ハッシュの列を保存したい場合には役立ちませんが、
GridFS
API を使用できます。 -
列をさまざまなチャンクに分割し、これらのチャンクをメインドキュメントにリンクされている他のドキュメントに保存することもできます。
これらすべてのアプローチを示す参照記事があります。