コレクションの数を減らす
コレクションを作成しすぎると、パフォーマンスが低下する恐れがあります。 MongoDBはコレクションごとに、追加のストレージを使用するデフォルトの _idインデックスを作成します。 過剰なコレクションを作成すると、それらのコレクションとインデックスがレプリカセットのリソースに負担がかかり、パフォーマンスを低下させる可能性があります。
このタスクについて
1 時間ごとの日次温度読み取り値を保存する次のスキーマを検討してください。 temperature
データベースは 1 日ごとの読み取り値を個別のコレクションに保存します。
// Temperatures for May 10, 2024 { _id: 1, timestamp: "2024-05-10T010:00:00Z", temperature: 60 }, { _id: 2 timestamp: "2024-05-10T011:00:00Z", temperature: 61 }, { _id: 3 timestamp: "2024-05-10T012:00:00Z", temperature: 64 } ...
// Temperatures for May 11, 2024 { _id: 1, timestamp: "2024-05-11T010:00:00Z", temperature: 68 }, { _id: 2 timestamp: "2024-05-11T011:00:00Z", temperature: 72 }, { _id: 3 timestamp: "2024-05-11T012:00:00Z", temperature: 72 } ...
コレクション数に上限がない場合、デフォルトの_id
インデックス数が増えてパフォーマンスが低下する可能性があります。
さらに、このアプローチでは複数のコレクションにわたってクエリを実行するために$lookup
操作が必要になります。 $lookup
操作はクエリの複雑さを含み、リソースに負担がかかる可能性があります。
コレクションの数を減らすには、未使用のコレクションを削除またはアーカイブするか、関連するコレクションを統合してデータを非正規化するか、必要に応じて埋め込みドキュメントを活用してデータスキーマを再モデル化します。
例
スキーマを変更して、毎日の温度の読み取りを単一のコレクションに保存することができます。 (例: )。
db.dailyTemperatures.insertMany( [ { _id: ISODate("2024-05-10T00:00:00Z"), readings: [ { timestamp: "2024-05-10T10:00:00Z", temperature: 60 }, { timestamp: "2024-05-10T11:00:00Z", temperature: 61 }, { timestamp: "2024-05-10T12:00:00Z", temperature: 64 } ] }, { _id: ISODate("2024-05-11T00:00:00Z"), readings: [ { timestamp: "2024-05-11T10:00:00Z", temperature: 68 }, { timestamp: "2024-05-11T11:00:00Z", temperature: 72 }, { timestamp: "2024-05-11T12:00:00Z", temperature: 72 } ] } ] )
更新されたスキーマは、元のスキーマよりも必要なリソースが少なくなります。 1 日ごとに個別のインデックスが必要になる代わりに、デフォルトの_id
インデックスを使用することで、日付別のクエリが容易になります。