Docs Menu
Docs Home
/
MongoDB Ops Manager
/ /

コレクション数の削減

項目一覧

  • 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インデックスを使用することで、日付別のクエリが容易になります。

Tip

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

データベース内のコレクションの数を確認するには、 mongoshから次のコマンドを実行します。

db.getCollectionNames().length

db.stats()メソッドは、データベース内のコレクションの数と、データやインデックスの合計サイズなどの役立つデータベース統計も返します。

MongoDB Ops Manager Data Explorerは、データベース内のコレクションの概要を提供します。 Data Explorer には、コレクションのインデックスのサイズを含む、コレクションの合計サイズが表示されます。 コレクションのサイズの大部分がインデックスで構成されている場合は、そのコレクションのデータを別のコレクションに統合し、元のコレクションを削除することを検討できます。 あるコレクションから別のコレクションにデータをマージするアプローチについては、 $mergeのドキュメントを参照してください。

さらに、Data Explorer によって空のコレクションがあることが示された場合は、それらのコレクションを Data Explorer から直接削除できます。

MongoDB Ops Managerリアルタイム パフォーマンス パネルは、どのコレクションが最もアクティビティを受信しているかを示します。 このツールを使用すると、コレクションを削除する前に、アプリケーションによってアクティブに使用されていないことを確認できます。

柔軟なデータモデルをスキーマに組み込む方法については、MongoDB.live 2020 の以下のプレゼンテーションを参照してください。

戻る

大きなドキュメント サイズの縮小