コレクション数の削減
Overview
コレクションは、 RDBMSテーブルと同様に、MongoDB ドキュメントのグループです。 コレクションは単一の データベース 内に存在します。
コレクションにドキュメントが含まれていない場合でも、削除不可のデフォルトの _id インデックスの形式でリソース コストが発生します。 このインデックスは単独では(特に小規模なコレクションの場合)、リソースが不足し、データベース割り当てに負担がかかる可能性があります。
配置に不要なコレクション、または増加したコレクションが含まれている場合は、コレクション数を減らし、最終的にアプリケーションのリソース要件を削減するためにデータを再構築することを検討する必要があります。
例
センサーから取得された温度読み取りのコレクションを保存する temperatures
データベースについて考えてみましょう。 センサーは、午前 10 時から午後 10 時までの 3 時間ごとの読み取りを取得します。 毎日の読み取りは、読み取り日付に応じて名前付けされた個別のコレクションに保存されます。
// temperatures.march-09-2020 { "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 }
// temperatures.march-10-2020 { "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
データベース内のコレクションの数は、日ごとに増加します。 コレクションの数に上限がないため、これらのコレクションとそれに対応するインデックスを維持するためのデータベースからの必要性はますます大きくなります。 データベースが最終的に数千のコレクションとインデックスを管理する点に達した場合、パフォーマンスの低下が生じる可能性があります。
さらに、このアプローチでは複数日にわたるクエリは簡単には実行されません。 複数日のデータをクエリして長期にわたる温度の傾向を取得するには、 $lookup
操作を実行する必要があります。この操作は、同じコレクション内のデータをクエリする場合よりパフォーマンスが良くありません。
更新されたスキーマ
代わりに、このデータを構造化するより優れたアプローチは、すべての温度の読み取りを単一のコレクションに保存し、毎日の読み取り値を 1 つのドキュメントで持つことです。 すべての温度が単一のコレクションにあるこの更新されたスキーマを検討します: temperatures.readings
:
// temperatures.readings { "_id": ISODate("2020-03-09"), "readings": [ { "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 }, { "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 }, ... { "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } ] } { "_id": ISODate("2020-03-10"), "readings": [ { "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 }, { "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 }, ... { "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 } ] }
この更新されたスキーマは、元のスキーマよりも必要なリソースがはるかに少なくなります。 現在、温度が読み取られる 1 日ごとにインデックスが必要になるのではなく、このコレクションのデフォルトの_id
インデックスを使用することで、日付別のクエリが容易になります。
不要なコレクションを確認する方法
MongoDB Shell
データベース内のコレクションの数を確認するには、 mongosh
から次のコマンドを実行します。
db.getCollectionNames().length
db.stats()メソッドは、データベース内のコレクションの数と、データやインデックスの合計サイズなどの役立つデータベース統計も返します。
MongoDB Atlas
Atlas UI
Data Explorerが有効になっている場合、Atlas UI にはデータベース内のコレクションの概要が表示されます。 Atlas UI には、コレクションのインデックスのサイズを含むコレクションの合計サイズが表示されます。 コレクションのサイズの大部分がインデックスで構成されている場合は、そのコレクションのデータを別のコレクションに統合し、元のコレクションを削除することを検討できます。 あるコレクションから別のコレクションにデータをマージするアプローチについては、 $merge
のドキュメントを参照してください。
さらに、Atlas UI で空のコレクションがあることが示された場合は、それらのコレクションを Atlas UI から直接削除できます。
リアルタイムのパフォーマンスパネル
Atlasリアルタイム パフォーマンス パネルは、どのコレクションが最もアクティビティを受信しているかを示します。 このツールを使用すると、コレクションを削除する前に、アプリケーションによってアクティブに使用されていないことを確認できます。
詳細
MongoDB のデータ モデリングと柔軟なスキーマ モデルの詳細については、「データ モデリングの概要」を参照してください。
データベースとコレクションの詳細については、「データベースとコレクション 」を参照してください。
関連データを単一のドキュメントに埋め込む方法の詳細については、「埋め込みデータモデル」を参照してください
MongoDB.Live 2020 のプレゼンテーション
柔軟なデータモデルをスキーマに組み込む方法については、MongoDB.live 2020 の以下のプレゼンテーションを参照してください。
MongoDB のエンティティ関係と、MongoDB を使用したデータ モデリングによるその実装例について学びます。
スキーマに組み込むことができる高度なデータモデリング設計パターンについて学ぶには、「高度なスキーマ デザイン パターン」をご覧ください。