注意
曖昧さ回避
このページでは、オンデマンド マテリアライズドビューについて説明します。標準ビューについて詳しくは、「 ビュー」をご覧ください。
ビュータイプの違いを理解するには、「 標準ビューとの比較 」を参照してください。
オンデマンドのマテリアライズドビューは、事前に計算された集計パイプラインの結果で、ディスクに保存され、ディスクから読み取られます。オンデマンドのマテリアライズドビューは通常、 $merge 、または$outステージの結果です。
標準ビューとの比較
MongoDB には、 標準ビュー と オンデマンドのマテリアライズドビューの 2 つの異なるビュータイプがあります。どちらのビュー タイプも、集計パイプラインから結果を返します。
標準ビューはビューを読み取るときに計算され、ディスクに保存されません。
オンデマンドのマテリアライズドビューはディスクに保存され、ディスクから読み取れます。保存されたデータをアップデートするために、
$mergeまたは$outステージを使用します。
Indexes
標準ビューでは、基になるコレクションのインデックスが使用されます。そのため、標準ビューでインデックスを直接作成、削除、再構築したり、ビューでインデックスのリストを取得したりすることはできません。
オンデマンドのマテリアライズドビューはディスクに保存されるため、インデックスを直接作成できます。
パフォーマンス
オンデマンドのマテリアライズドビューは、クエリの一部として計算されるのではなくディスクから読み取られるため、標準ビューよりも読み取りパフォーマンスが向上します。このパフォーマンス上の利点は、パイプラインの複雑さと集約されるデータのサイズに応じて大きくなります。
MongoDB Atlas UI でマテリアライズド ビューを作成する
このセクションの例では、訓練用サンプル データセットを使用します。サンプル データセットを MongoDB Atlas 配置にロードする方法について詳しくは、「サンプル データのロード」を参照してください。
MongoDB Atlas UI でマテリアライズドビューを作成するには、次の手順に従います。
MongoDB Atlas UIで、プロジェクトの Clusters ページに移動します。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。
サイドバーで、 Database見出しの下のClustersをクリックします。
[ Clusters (クラスター) ] ページが表示されます。
Select ドロップダウン メニューから集計ステージを選択します
集計ステージでは、ビューとして保存するデータが変換されます。利用可能な集計ステージの詳細については、「集計ステージ」を参照してください。
この例では、 $set ステージで新しいフィールドを追加しています。
Selectドロップダウン メニューから [
$set] を選択します。次の構文を集計パイプラインエディターに追加して、
gradesコレクション内のscores配列のすべてのscore値の平均スコアを作成します。{ averageScore: { $avg: "$scores.score" } } MongoDB Atlas は各ドキュメントに
averageScore値を追加します。
$out ステージを追加します
Selectドロップダウン メニューから
$outステージを選択します。集約パイプラインに次の構文を追加して、パイプラインの結果を
sample_trainingデータベースのmyViewコレクションに書き込みます。'myView' [Save Documents] をクリックします。
$out ステージでは、集計パイプラインの結果を指定されたコレクションが書き込まれ、ビューが作成されます。詳細については、 $outを参照してください。
myViewコレクションを表示するには、コレクションのリストを更新してください。
MongoDB Atlas UI でmyViewコレクションをクエリする方法については、MongoDB Atlas ドキュメントの「ドキュメントの表示、フィルタリング、ソート 」を参照してください。
例
この例では、sample_mflix データセットの movies コレクションを使用します。サンプル データをロードする方法については、「サンプル データのロード」を参照してください。
1. オンデマンドのマテリアライズドビューを定義する
次の updateMovieStats 関数は、年別の映画の IMDb 評価のカウントと平均を含む movieYearStats マテリアライズドビューを定義します。この関数は、その年以降に公開された映画の統計を更新するための startYear パラメータを受け入れます。
updateMovieStats = function(startYear) { db.movies.aggregate( [ { $match: { year: { $gte: startYear } } }, { $group: { _id: "$year", movieCount: { $sum: 1 }, avgRating: { $avg: "$imdb.rating" } } }, { $merge: { into: "movieYearStats", whenMatched: "replace" } } ] ); };
$matchステージは、year値がstartYear以上の映画のみを処理するようにフィルターします。$groupステージでは、映画をyearでグループ化します。このステージで出力されるドキュメントは、以下のような形式になります。{ "_id" : <year>, "movieCount" : <num>, "avgRating" : <num> } $mergeステージは出力をmovieYearStatsコレクションに書き込みます。このステージは
_idフィールドで 一致し、各集計結果が既存のドキュメントと 一致するかどうかを確認します。一致がある場合(つまり、同じ年を持つドキュメントがコレクション内に既に存在する場合)、このステージは既存のドキュメントを集計結果のドキュメントに置き換えます。
一致しない場合、ステージは集計結果からドキュメントをコレクションに挿入します(一致しない場合のデフォルトの動作)。
2. 初期実行の実行
初回の実行では、開始年を渡して、その年以降のデータを movieYearStats に入力します。
updateMovieStats(2015);
初回の実行後、db.movieYearStats.find().sort( { _id: 1 } ) は次のようなドキュメントを返します。
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
3. マテリアライズドビューのアップデート
新しい映画が 2016 の movies コレクションに追加されると仮定します。
db.movies.insertOne( { title: "Grove Test Movie", year: 2016, imdb: { rating: 7.5, votes: 500 } } )
2016 以降の movieYearStats を更新するには、startYear を 2016 に設定して関数を実行します。
updateMovieStats(2016);
更新された movieYearStats には、movies コレクションの新作映画が反映されています。db.movieYearStats.find().sort( { _id: 1 } ) は以下を返します。
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
詳細情報
$merge段階:
同じデータベースまたは異なるデータベース内のコレクションに出力できます。
出力コレクションがまだ存在しない場合は、新しいコレクションを作成します。
結果(新しいドキュメントの挿入、ドキュメントのマージ、ドキュメントの置換、既存のドキュメントの保持、操作の失敗、カスタムアップデートパイプラインによるドキュメントの処理)を既存のコレクションに組み込むことができます。
シャーディングされたコレクションに出力できます。入力コレクションもシャーディング可能です。
以下については、$mergeを参照してください:
$mergeと利用可能なオプションに関する詳細情報