計算されたデータを保存する
アプリケーションでは、データベースに保存されているソース データから値を生成する必要がある場合があります。新しい 値を計算するには、特に大規模なデータセットの場合や複数のドキュメントを調査する必要がある場合に、大量の CPU リソースが必要になる可能性があります。
計算値が頻繁に要求される場合は、その値をデータベースに保存すると効率的です。アプリケーションがデータをリクエストする場合、必要な読み取り操作は 1 回だけです。
このタスクについて
読み取りが書込みよりも大幅に一般的である場合、計算されたパターンによってデータ計算の頻度が減ります。読み取りごとに値を計算する代わりに、アプリケーションは計算された値を保存し、必要に応じて再計算します。アプリケーションは、計算値のソースデータを変更する書き込みごとに、または 定期的なジョブの一部として値を再計算できます。
注意
定期的な更新では、返される計算値は正確な保証されません。ただし、正確な精度が必要ない場合は、このアプローチはパフォーマンスの向上に見合う価値がある場合があります。
手順
この例では 、アプリケーションに映画の収益ユーザーは、特定の映画とその映画が行った金額を検索できます。
サンプル データの挿入
screenings
コレクションを作成します 。
db.screenings.insertMany( [ { theater: "Alger Cinema", location: "Lakeview, OR", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 344, revenue: 3440 }, { theater: "City Cinema", location: "New York, NY", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 1496, revenue: 22440 }, ] )
計算データの挿入
ユーザーは多くの場合、特定の映画を何人見ているか、その映画が構築した:現在のスキーマで、 num_viewers
とrevenue
を追加するには、「ビルドの失敗」というタイトルの映画を公開した映画館に対して読み取りを実行し、それらのフィールドの値を合計する必要があります。
情報が要求されるたびにその計算を実行しないようにするには、合計値を計算し、映画レコード自体とともにmovies
コレクションに保存します。
db.movies.insertOne( { _id: 1, title: "Lost in the Shadows", total_viewers: 1840, total_revenue: 25880 } )
計算データを更新しました
新しいスケーリングがscreenings
コレクションに追加されるとします。
db.screenings.insertOne( { theater: "Overland Park Cinema", location: "Boise, ID", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 760, revenue: 7600 } )
movies
コレクション内の計算されたデータは、現在のスケーリング データを反映しなくなりました。計算データをどのくらいの頻度で更新するかは、アプリケーションによって異なります。
低書込み環境では、
screenings
データの更新と組み合わせて計算が発生する可能性があります。より定期的な書込み (write) がある環境では、計算は定義された間隔で(例: 1 時間ごと)に実行できます。
screenings
のソースデータは、movies
コレクションへの書込みの影響を受けないため、いつでも計算を実行できます。
スケーリング データに基づいて計算されたデータを更新するには、次の集計を定期的に実行します。
db.screenings.aggregate( [ { $group: { _id: "$movie_id", total_viewers: { $sum: "$num_viewers" }, total_revenue: { $sum: "$revenue" } } }, { $merge: { into: { db: "test", coll: "movies" }, on: "_id", whenMatched: "merge" } } ] )
結果
計算されたパターンによって CPUワークロードが軽減され、アプリケーションのパフォーマンスが向上します。計算されたパターンについて考えてみましょう。アプリケーションが同じ計算を繰り返し実行し、読み取りと書込みの比率が高い場合。