Overview
このガイドでは、変更ストリームを使用してデータに対するリアルタイムの変更を監視する方法を学習できます。 変更ストリームは、アプリケーションがコレクション、データベース、または配置のデータ変更をサブスクライブできる MongoDB Server の機能です。
Rubyドライバーを使用する場合、watch
メソッドを呼び出して Mongo::Collection::View::ChangeStream
オブジェクトを返すことができます。次に、そのコンテンツを反復処理して、アップデート、挿入、削除などのデータ変更を監視できます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセット の sample_restaurants
データベースの restaurants
コレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Client
オブジェクトを作成し、次の値を database
変数と collection
変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
変更ストリームを開く
変更ストリームを開くには、watch
メソッドを呼び出します。watch
メソッドを呼び出すオブジェクトによって、変更ストリームが監視するイベントの範囲が決まります。次のオブジェクトで watch
メソッドを呼び出せます
Mongo::Client
: 配置内のすべてのデータベースにわたるすべてのコレクションに対する変更を監視します。ただし、システム コレクションまたはadmin
、 、 データベースのコレクションは対象外です。local
config
Mongo::Database
: 1 つのデータベース内のすべてのコレクションに対する変更を監視Mongo::Collection
: 1 つのコレクションの変更を監視
次の例では、 restaurants
コレクションの変更ストリームを開き、変更が発生に応じて出力します。
stream = collection.watch stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
変更の監視を開始するには、上記のコードを実行します。 次に、別shellで、restaurants
コレクションを変更します。 次の例では、 name
フィールドの値が'Blarney Castle'
であるドキュメントを更新します。
collection.update_one( { 'name' => 'Blarney Castle' }, { '$set' => { 'cuisine' => 'Irish' } } )
コレクションを更新すると、変更ストリームアプリケーションは変更が発生に応じて出力します。 出力される変更イベントは、次の出力のようになります。
{"_id"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=>#<...>, "ns"=>{"db"=>"sample_restaurants", "coll"=>"restaurants"}, "documentKey"=> {"_id"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=> {"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}
変更ストリーム出力の変更
変更ストリーム出力を変更するには、配列内のパイプラインステージをwatch
メソッドのパラメーターとして渡します。 配列には、次のステージを含めることができます。
$addFields
または$set
: ドキュメントに新しいフィールドを追加します$match
: ドキュメントをフィルタリングします$project
:ドキュメントフィールドのサブセットをプロジェクションします$replaceWith
または$replaceRoot
: 入力ドキュメントを指定されたドキュメントで置き換え$redact
: ドキュメントのコンテンツを制限します$unset
: ドキュメントからフィールドを削除します
次の例では、 $match
ステージを含むパイプラインをwatch
メソッドに渡します。 これは、アップデート操作が発生した場合にのみイベントを出力するようにwatch
メソッドに指示します。
pipeline = [{ '$match' => { 'operationType' => 'update' } }] stream = collection.watch(pipeline) stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
監視動作の変更
watch
メソッドの動作を変更するには、オプション ハッシュをパラメーターとして watch
に渡します。次の表では、設定できるオプションの一部について説明しています。
オプション | 説明 |
---|---|
| Specifies whether to show the full document after the change, rather
than showing only the changes made to the document. To learn more about
this option, see the Include Pre-Images and Post-Images section of this
guide. |
| Specifies whether to show the full document as it was before the change, rather
than showing only the changes made to the document. To learn more about
this option, see Include Pre-Images and Post-Images. |
| Specifies the logical starting point for the change stream. This option is mutually exclusive with start_at_operation_time . |
| Instructs the change stream to only provide changes that occurred at or after
the specified timestamp. This option is mutually exclusive with resume_after . |
| Sets the collation to use for the change stream cursor. |
watch
オプションの完全なリストについては、 APIドキュメントの監視を参照してください。
変更前と変更後のイメージを含めます
重要
配置で MongoDB v 6.0以降が使用されている場合にのみ、コレクションで変更前と変更後のイメージを有効にできます。
デフォルトでは 、コレクションに対して操作を実行すると、対応する変更イベントには操作の前後で変更されたフィールドとその値のみが含まれます。
watch
変更されたフィールドに加えて、ドキュメントの 変更前のイメージ 、変更前のドキュメントの完全なバージョンを返すよう、 メソッドに指示できます。変更ストリームイベントに変更前のイメージを含めるには、full_document_before_change
オプションを設定するオプション ハッシュを watch
に渡します。このオプションは、次の string 値に設定できます。
'whenAvailable'
: 変更イベントには、変更イベント用に変更されたドキュメントの変更前のイメージが含まれます。 変更前のイメージが利用できない場合、この変更イベントフィールドの値はnil
になります。'required'
: 変更イベントには、変更イベント用に変更されたドキュメントの変更前のイメージが含まれます。 変更前のイメージが利用できない場合、サーバーはエラーを発生させます。'off'
:(デフォルト)変更イベントには、 変更されたドキュメントの変更前のイメージは含まれません。
また、変更されたwatch
フィールドに加えて、ドキュメントの 変更後のイメージ 、変更後のドキュメントの完全なバージョンを返すよう、 メソッドに指示することもできます。変更ストリームイベントに変更後のイメージを含めるには、full_document
オプションを設定するオプション ハッシュを watch
に渡します。このオプションは、次の string 値に設定できます。
'updateLookup'
: 変更イベントには、変更後一定時間の変更されたドキュメント全体のコピーが含まれます。'whenAvailable'
: 変更イベントには、変更イベントの変更されたドキュメントの変更後のイメージが含まれます。 変更後イメージが利用できない場合、この変更イベントフィールドの値はnil
になります。'required'
: 変更イベントには、変更イベントの変更されたドキュメントの変更後のイメージが含まれます。 変更後のイメージが利用できない場合、サーバーはエラーを発生させます。'default'
:(デフォルト)変更イベントには、変更されたドキュメントの変更後のイメージは含まれません。
次の例では、コレクションでwatch
メソッドを呼び出し、 full_document
オプションを設定して更新されたドキュメントの変更後のイメージを含めます。
options = { full_document: 'updateLookup' } stream = collection.watch([], options) stream.each do |doc| puts doc break if doc['operationType'] == 'invalidate' end
別shellで実行中されている変更ストリームアプリケーションでは、前述の更新例を使用して restaurants
コレクション内のドキュメントを更新すると、次の出力のような変更イベントが出力されます。
{"_id"=>{"_data"=>"..."}, "operationType"=>"update", "clusterTime"=> #<...1>, "wallTime"=>..., "fullDocument"=>{"_id"=>BSON::ObjectId('...'), "address"=>{"building"=>"202-24", "coord"=>[-73.9250442, 40.5595462], "street"=>"Rockaway Point Boulevard", "zipcode"=>"11697"}, "borough"=>"Queens", "cuisine"=>"Irish", "grades"=>[...], "name"=>"Blarney Castle", "restaurant_id"=>"40366356"}, "ns"=> {"db"=>"sample_restaurants", "coll"=>"restaurants"}, "documentKey"=> {"_id"=>BSON::ObjectId('...')}, "updateDescription"=>{"updatedFields"=> {"cuisine"=>"Irish"}, "removedFields"=>[], "truncatedArrays"=>[]}}
Tip
変更前と変更後のイメージの詳細については、Change Streams MongoDB Serverマニュアルの「 とドキュメントの変更 前イメージおよび変更後イメージ 」を参照してください。
詳細情報
Change Streams変更ストリームの詳細については、MongoDB Server マニュアルの 「 ストリーム」 を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。