AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

データの変更を監視

このガイドでは、変更ストリームを使用してデータに対するリアルタイムの変更を監視する方法を学習できます。 変更ストリームは、アプリケーションがコレクション、データベース、または配置のデータ変更をサブスクライブできる 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クラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。

変更ストリームを開くには、watch メソッドを呼び出します。watch メソッドを呼び出すオブジェクトによって、変更ストリームが監視するイベントの範囲が決まります。次のオブジェクトで watch メソッドを呼び出せます

次の例では、 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 に渡します。次の表では、設定できるオプションの一部について説明しています。

オプション
説明

full_document

ドキュメントに加えられた変更のみを表示するのではなく、変更後にドキュメント全体を表示するかどうかを指定します。このオプションの詳細については、このガイドの「 変更前とイメージと変更後のイメージを含める 」セクションを参照してください。

full_document_before_change

ドキュメントに加えられた変更のみを表示するのではなく、変更前のドキュメント全体を表示するかどうかを指定します。 このオプションの詳細については、「変更前イメージと変更後イメージを含める」を参照してください。

resume_after


変更ストリームの論理的な開始点を指定します。このオプションはstart_at_operation_time と排他関係にあります。

start_at_operation_time

指定されたタイムスタンプの時点またはその後に発生した変更のみを提供するように変更ストリームに指示します。このオプションは
resume_afterと排他関係にあります。

collation

変更ストリームカーソルに使用する照合を設定します。

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 ドキュメントを参照してください。