AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

ストリーミングマテリアライズドビューをビルドする

ストリーミング マテリアライズドビューは、Atlas Stream Processing ストリーム プロセッサーが更新し続けるコレクションです。これを実現するため、ストリーム プロセッサーはソース コレクションへの変更を読み取り、その変更の影響を計算し、その結果をビューに適用します。ビューは、手動またはスケジュールされた更新なしでソース データの現在の状態を反映します。

ストリーミングマテリアライズドビューは、ダッシュボード、実行中の合計、開始アイテムのカウントなど、ソースデータの変更よりも計算結果の読み取りが多いワークロードに適しています。データが到着するとビューが更新されるため、読み取りにより、低レイテンシで現在の結果が返されます。

MongoDB は、マテリアライズドビューに対する2つのアプローチをサポートしています。

  • オンデマンドのマテリアライズドビューには、手動または予定に基づいて実行する集計パイプラインの結果が保存されます。

  • ストリーミングマテリアライズドビューは、継続的に実行されるAtlas Stream Processingストリームプロセッサの結果を保存します。

どの方法でも、計算結果をディスクに保存し、ビューから直接読み取りを行います。ビューの更新方法と時期が異なります。

特性
オンデマンドのマテリアライズドビュー
ストリーミング マテリアライズドビュー

trigger の更新

手動またはスケジュールされたもの

変更駆動型、継続的

レイテンシ

数分から数日

1 秒未満~数秒

データの新鮮度

点インタイム スナップショット

永久に同期される

コンピュート モデル

全体の結果を再計算します

増分効果を計算します

Best fit

バッチするレポート作成、定期的集計

ライブ ダッシュボード、運用分析

ストリーミング マテリアライズドビューの維持は、標準の Atlas Stream Processing 集計ステージから構成されるパスワードなしです。このパスワードなしを実装するストリーム プロセッサには、次の特徴があります。

  • 変更ストリーム ソースを読み取ります。fullDocument と fullDocumentBeforeChange が required に設定された $source ステージは、パイプラインが変更前後の各ドキュメントの状態を比較できるように、ソース コレクションから読み取ります。

  • イベントごとに符号付きの差分を計算します。$addFields ステージでは、$switch 式を使用して、変更が計算結果にどのように影響するかに基づいて、各挿入、更新、または削除に正または負の値を割り当てることができます。

  • 結果をウィンドウにグループ化します。ストリーム プロセッサーは無限のストリームで動作するため、すべての $group ステージはウィンドウ ステージ内で実行する必要があります。ウィンドウ化された $group は、ウィンドウ間隔でキーごとの差分を合計します。ウィンドウ間隔はビューの更新間隔としても機能するため、ビューの新鮮度を決定します。設定できる最小の間隔は 1 ミリ秒です。

  • 結果を追加して適用します。$merge ステージでは、各ウィンドウの結果をビューの実行中の合計に追加するパイプライン whenMatched を使用できます。これにより、結果が置き換えられることはありません。

  • シンクステージで終了します。Stream Processing パイプラインはシンクステージで終了する必要があります。Use $merge を使用して Atlas コレクションに書き込み (write)ます。

増分集計のみがストリーミングマテリアライズドビューに変換されます。完全なコレクションスキャンが必要な集計は対象外です。

ストリーミングのマテリアライズドビューは、ダウンストリームのコンシューマーに影響を与える方法でバッチ集計とは異なります。

  • ビューはゼロから始まります。デフォルトでは、プロセッサは既存のドキュメントを読み取らないため、プロセッサを開始する前にビューをシードするか、$source ステージで initialSync を有効にします。

  • ソースの変更のみが更新を行います。パイプラインで $lookup ステージを使用する場合、参照コレクションに後で変更が加えられても、ビューが既に書き込み (write) を行ったドキュメントは更新されません。

次のチュートリアルでは、購入方法別の完了した販売数を維持するストリーミングマテリアライズドビューを作成します。ストリーム プロセッサは、sample_supplies.sales コレクションの変更ストリームを読み取り、sample_supplies.sales_by_channel コレクションに書き込み (write)ます。

注意

ストリーム プロセッサーは、また Apache Kafka トピックから読み取り、 AWS S3 上の Apache Iceberg テーブルへの書き込み (write) を行うこともできます。詳細については、Apache Kafka Broker および $iceberg 集計ステージ。を参照してください。

Stream Processingプロセッサーを作成する前に、ソースデータを保持するクラスターへの Atlas 接続を含む Stream Processingワークスペース が必要です。接続を追加するには、接続の管理 を参照してください。

このセクションのコマンドをクラスターに対して実行します。接続するには、「mongosh を使用してクラスターに接続する」を参照してください。

ソース コレクションを準備し、ビューをシードするには、次の手順に従ってください。

1

この手順では、sample_supplies データセットの sales コレクションを使用します。サンプル データのロード方法を学ぶには、Atlas 配置へのサンプル データのインポートを参照してください。

2

ストリームプロセッサが完了して返品された販売を検出できるように、status フィールドを追加します。クラスターに対して次のコマンドを実行します。

db.sales.updateMany( { status: { $exists: false } }, { $set: { status: "completed" } })
3

ストリームプロセッサーが各変更の影響を計算できるように、ソースコレクションでプレイメージと書き込みイメージを有効にします。クラスターに対して次のコマンドを実行します。

db.getSiblingDB("sample_supplies").runCommand({ collMod: "sales", changeStreamPreAndPostImages: { enabled: true }})
4

クラスターに対して次のバッチする集計を実行し、ビューに現在のカウントを移入します。

db.sales.aggregate([ { $match: { status: "completed" } }, { $group: { _id: "$purchaseMethod", active_count: { $sum: 1 } } }, { $merge: { into: "sales_by_channel", whenMatched: "replace", whenNotMatched: "insert" } }])

シードされたカウントを確認するには、ビューをクエリします。sales_by_channel コレクションには、購入方法ごとに 1 つのドキュメントが含まれています。

db.sales_by_channel.find()

このシード集計は、それ自身が オンデマンド マテリアライズドビュー です。2 つのビュー タイプは相補的です。バッチする集計でオンデマンド マテリアライズドビューを初期化し、同じコレクションを現在の状態に保つストリーム プロセッサーを起動できます。オンデマンド ビューはストリーミング マテリアライズドビューになります。

注意

パイプラインでウィンドウステージを使用しない場合は、代わりに initialSync を使用してビューにシードすることができます。この場合、ストリームプロセッサーはまず、ソース コレクション内の存在するすべてのドキュメントを挿入イベントとして取り込み、次に新しい変更イベントを処理します。$source オプション initialSync について学ぶには、MongoDB コレクション変更ストリーム。を参照してください。

Atlas UI または mongosh を選択してストリームプロセッサーを作成します。

インターフェース

このセクションのコマンドをクラスターに対して実行します。接続するには、「mongosh を使用してクラスターに接続する」を参照してください。

プロセッサーを開始すると、sales コレクションへの変更は数秒以内に sales_by_channel を更新します。これを確認するには、新しい完了したオンライン販売を挿入します。

db.sales.insertOne({ saleDate: new Date(), purchaseMethod: "Online", status: "completed", items: [], customer: {}, couponUsed: false})

プロセッサーは Online カウントを増分し、ウィンドウ境界を lastWindowStart にレコードします。

db.sales_by_channel.find()
[ { _id: 'Phone', active_count: 596 }, { _id: 'Online', active_count: 1586, lastWindowStart: ISODate('2026-07-23T15:18:01.000Z') }, { _id: 'In store', active_count: 2819 }]

カスタマーがその販売を返品すると、Online カウントはシード値に戻ります。

db.sales.updateOne( { purchaseMethod: "Online", status: "completed" }, { $set: { status: "returned" } })
db.sales_by_channel.find()
[ { _id: 'Phone', active_count: 596 }, { _id: 'Online', active_count: 1585, lastWindowStart: ISODate('2026-07-23T15:18:13.000Z') }, { _id: 'In store', active_count: 2819 }]

これらの例では、Atlas Stream Processing の例リポジトリの smv の例 について説明します。優先順位ごとに 1 つのドキュメントを保持し、開始されたサポート チケットの実行中のカウントを保持する queue_stats コレクションを維持します。ストリームプロセッサは support_tickets 変更ストリームを読み取り、チケットが開始、解決、削除されるたびに各カウントを更新します。

このガイドのステージと概念についてさらに学ぶには、次のリソースを参照してください。