Docs Menu
Docs Home
/ /

オンデマンドのマテリアライズドビュー

注意

曖昧さ回避

このページでは、オンデマンド マテリアライズドビューについて説明します。標準ビューについて詳しくは、「 ビュー」をご覧ください。

ビュータイプの違いを理解するには、「 標準ビューとの比較 」を参照してください。

オンデマンドのマテリアライズドビューは、事前に計算された集計パイプラインの結果で、ディスクに保存され、ディスクから読み取られます。オンデマンドのマテリアライズドビューは通常、 $merge 、または$outステージの結果です。

MongoDB には、 標準ビューオンデマンドのマテリアライズドビューの 2 つの異なるビュータイプがあります。どちらのビュー タイプも、集計パイプラインから結果を返します。

  • 標準ビューはビューを読み取るときに計算され、ディスクに保存されません。

  • オンデマンドのマテリアライズドビューはディスクに保存され、ディスクから読み取れます。保存されたデータをアップデートするために、$mergeまたは$outステージを使用します。

    注意

    $mergeを使用すると、変更ストリームを使用してマテリアライズドビューの変更を監視できます。 $outを使用している場合、マテリアライズドビューの変更を監視することはできません。

標準ビューでは、基になるコレクションのインデックスが使用されます。そのため、標準ビューでインデックスを直接作成、削除、再構築したり、ビューでインデックスのリストを取得したりすることはできません。

オンデマンドのマテリアライズドビューはディスクに保存されるため、インデックスを直接作成できます。

オンデマンドのマテリアライズドビューは、クエリの一部として計算されるのではなくディスクから読み取られるため、標準ビューよりも読み取りパフォーマンスが向上します。このパフォーマンス上の利点は、パイプラインの複雑さと集約されるデータのサイズに応じて大きくなります。

このセクションの例では、訓練用サンプル データセットを使用します。サンプル データセットを MongoDB Atlas 配置にロードする方法について詳しくは、「サンプル データのロード」を参照してください。

MongoDB Atlas UI でマテリアライズドビューを作成するには、次の手順に従います。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーの Projects メニューからプロジェクトを選択します。

  3. サイドバーで、 Database見出しの下のClustersをクリックします。

    [ Clusters (クラスター) ] ページが表示されます。

2
  1. サンプル データを含むクラスターで、[ Browse Collections ] をクリックします。

  2. 左側のナビゲーション ペインで、sample_training データベースを選択します。

  3. grades コレクションを選択します。

3
4
5

集計ステージでは、ビューとして保存するデータが変換されます。利用可能な集計ステージの詳細については、「集計ステージ」を参照してください。

この例では、 $set ステージで新しいフィールドを追加しています。

  1. Selectドロップダウン メニューから [$set] を選択します。

  2. 次の構文を集計パイプラインエディターに追加して、grades コレクション内の scores 配列のすべての score 値の平均スコアを作成します。

    {
    averageScore: { $avg: "$scores.score" }
    }

    MongoDB Atlas は各ドキュメントにaverageScore値を追加します。

6
7
  1. Selectドロップダウン メニューから $out ステージを選択します。

  2. 集約パイプラインに次の構文を追加して、パイプラインの結果を sample_training データベースの myView コレクションに書き込みます。

    'myView'
  3. [Save Documents] をクリックします。

$out ステージでは、集計パイプラインの結果を指定されたコレクションが書き込まれ、ビューが作成されます。詳細については、 $outを参照してください。

myViewコレクションを表示するには、コレクションのリストを更新してください。

MongoDB Atlas UI でmyViewコレクションをクエリする方法については、MongoDB Atlas ドキュメントの「ドキュメントの表示、フィルタリング、ソート 」を参照してください。

この例では、sample_mflix データセットの movies コレクションを使用します。サンプル データをロードする方法については、「サンプル データのロード」を参照してください。

次の 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 フィールドで 一致し、各集計結果が既存のドキュメントと 一致するかどうかを確認します。

初回の実行では、開始年を渡して、その年以降のデータを 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> }

新しい映画が 2016 の movies コレクションに追加されると仮定します。

db.movies.insertOne( {
title: "Grove Test Movie",
year: 2016,
imdb: { rating: 7.5, votes: 500 }
} )

2016 以降の movieYearStats を更新するには、startYear2016 に設定して関数を実行します。

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を参照してください:

戻る

サポートされている操作

項目一覧