db.watch()
定義
db.watch( pipeline, options )
レプリカセットとシャーディングされたクラスターのみ
データベースの変更ストリーム カーソルを開き、
system
以外のすべてのコレクションについてレポートします。Parameterタイプ説明pipeline
配列任意。次の集計ステージの1つ以上で構成される集計パイプライン:
変更イベント出力をフィルタリング/修正するためのパイプラインを指定します。
MongoDB 4.2 以降では、変更ストリームの集計パイプラインでイベントの _id フィールドが変更される場合、変更ストリームで例外がスローされるようになります。
options
ドキュメントoptions
ドキュメントには、次のフィールドと値を含めることができます。フィールドタイプ説明resumeAfter
ドキュメント任意。 変更ストリームの論理的な開始点として再開トークンを指定します。
invalidate
イベント後に変更ストリームを再開するために使用することはできません。resumeAfter
は、startAfter
およびstartAtOperationTime
と排他関係にあります。startAfter
ドキュメント任意。 変更ストリームの論理的な開始点として再開トークンを指定します。
resumeAfter
とは異なり、startAfter
は新しい変更ストリームを作成することで、invalidate
イベント後に通知を再開できます。startAfter
は、resumeAfter
およびstartAtOperationTime
と排他関係にあります。fullDocument
string任意。 デフォルトでは、アップデートされたドキュメント全体ではなく、アップデート操作によって変更されたフィールドのデルタが返され
db.watch()
。fullDocument
を"updateLookup"
に設定すると、更新されたドキュメントの過半数がコミットした最新のバージョンを参照するようdb.watch()
に指示します。db.watch()
は、updateDescription
デルタに加えて、ドキュメント検索を含むfullDocument
フィールドを返します。MongoDB 6.0 以降では、
fullDocument
を次のように設定できます。"whenAvailable"
これは、ドキュメントの挿入、置換、または更新後に、利用可能な場合、ドキュメントの変更後のイメージを出力するためです。"required"
ドキュメントの挿入、置換、またはアップデート後に、ドキュメントの変更後のイメージを出力します。変更後のイメージが利用できない場合、エラーが発生します。
fullDocumentBeforeChange
string任意。デフォルトは、
"off"
に設定されています。MongoDB 6.0 以降では、新しい
fullDocumentBeforeChange
フィールドを使用して次のように設定できます。"whenAvailable"
ドキュメントの置換、アップデート、または削除前に、利用可能な場合、ドキュメントの変更前のイメージを出力します。"required"
これは、ドキュメントが置換、更新、削除される前に、ドキュメントの変更前のイメージを出力するためです。変更前のイメージが利用できない場合、エラーが発生します。"off"
変更前のドキュメントのイメージを非表示にします。デフォルトは"off"
です。
batchSize
整数任意。MongoDB クラスターからのレスポンスの各バッチで返す変更イベントの最大数を指定します。
cursor.batchSize()
と同じ機能を持ちます。maxAwaitTimeMS
整数任意。空のバッチを返す前に、新しいデータ変更が変更ストリーム カーソルに報告されるまでサーバーが待機する最大時間(ミリ秒)。
デフォルトは
1000
ミリ秒です。collation
ドキュメント任意。照合ドキュメントを渡し、変更ストリーム カーソルの照合順序を指定します。
省略した場合、デフォルトは
simple
バイナリ比較になります。startAtOperationTime
タイムスタンプ任意。変更ストリームの開始点。過去の開始点を指定する場合、oplog の時間範囲内である必要があります。oplog の時間範囲を確認するには、
rs.printReplicationInfo()
を参照してください。startAtOperationTime
は、resumeAfter
およびstartAfter
と排他関係にあります。次の値を返します。 変更イベント ドキュメント上のカーソル。 変更イベント ドキュメントの例については、「変更イベント」を参照してください。
可用性
配置
db.watch()
は、レプリカセットとシャーディングされたクラスターで利用できます。
レプリカセットの場合、データを保持している任意のメンバーに対して
db.watch()
を発行できます。シャーディングされたクラスターの場合、 インスタンスで
db.watch()
mongos
を発行する必要があります。
ストレージ エンジン
読み取り保証 (read concern)majority
サポート
変更ストリームは、 "majority"
の読み取り保証 (read concern) のサポートに関係なく 使用できます 。つまり、変更ストリームを使用するには、読み取り保証(read concern) majority
サポートを有効にする(デフォルト)か無効にするかを選択できます。
動作
admin
、local
、またはconfig
データベースではdb.watch()
を実行できません。db.watch()
データを保持しているノードの大半に反映されたデータ変更についてのみ通知します。変更ストリーム カーソルは、次のいずれかが発生するまで開いたままになります。
存在しないデータベースに対して
db.watch()
を実行できます。 ただし、データベースが作成され、データベースを削除すると、変更ストリーム カーソルが閉じます。
再開可能性
MongoDBドライバーとは異なり、 mongosh
はエラー後に変更ストリーム カーソルの再開を自動的に試行しません。 MongoDB ドライバーは、特定のエラーが発生後に 変更ストリーム カーソルの自動的な再開を1 回試行します。
db.watch()
は、oplog に保存されている情報を使用して変更イベントの説明を生成し、その操作に関連付けられた再開トークンを生成します。 resumeAfter
またはstartAfter
オプションに渡される再開トークンによって識別される操作がすでにoplogから削除されている場合、 db.watch()
は変更ストリームを再開できません。
変更ストリームの再開の詳細については、「変更ストリームの再開」を参照してください。
注意
無効化イベント(コレクションの削除や名前の変更など)によってストリームが閉じられた後は、
resumeAfter
を使用して変更ストリームを再開することはできません。 Instead, you can use startAfter to start a new change stream after an invalidate event.配置がシャーディングされたクラスターの場合、シャードを削除すると、開いている変更ストリームのカーソルが閉じることがあります。閉じた変更ストリームのカーソルは完全に再開できない場合があります。
注意
無効化イベント(コレクションの削除や名前の変更など)によってストリームが閉じられた後は、 resumeAfter
を使用して変更ストリームを再開することはできません。 Instead, you can use startAfter to start a new change stream after an invalidate event.
アップデート 操作の完全なドキュメント検索
デフォルトでは、変更ストリーム カーソルはアップデート操作における特定のフィールドの変更またはデルタを返します。また、変更されたドキュメントのうち、過半数がコミットした最新のバージョンを検索して返すように変更ストリームを構成できます。アップデートと検索の間に他の書き込み操作が行われた場合、返されるドキュメントがアップデート実行時のドキュメントと大幅に異なる可能性があります。
アップデート操作中に適用された変更の数と完全なドキュメントのサイズによっては、アップデート操作における変更イベント ドキュメントのサイズが BSON ドキュメントの制限である 16 MB を超えるリスクがあります。サイズが超過した場合、サーバーで変更ストリーム カーソルが閉じられ、エラーが返されます。
アクセス制御
アクセス制御を使用して実行中の場合、ユーザーは データベースfind
リソース に対してchangeStream
および 特権アクションを持っている必要があります。つまり、ユーザーは、次の 特権 を付与する ロール を持っていなければなりません。
{ resource: { db: <dbname>, collection: "" }, actions: [ "find", "changeStream"] }
組み込みの read
ロールにより、適切な権限が付与されます。
カーソルの反復
MongoDB には、カーソルを反復処理する方法が複数用意されています。
cursor.hasNext()
メソッドの場合、ブロックして次のイベントを待機します。watchCursor
カーソルを監視してイベントを反復処理するには、次のように hasNext()
を使用します。
while (!watchCursor.isClosed()) { if (watchCursor.hasNext()) { firstChange = watchCursor.next(); break; } }
cursor.tryNext()
メソッドはノンブロッキングです。watchCursor
カーソルを監視してイベントを反復処理するには、次のように tryNext()
を使用します。
while (!watchCursor.isClosed()) { let next = watchCursor.tryNext() while (next !== null) { printjson(next); next = watchCursor.tryNext() } }
例
mongosh
の次の操作は、 hr
データベース上で変更ストリーム カーソルを開きます。 返されたカーソルは、そのデータベース内のすべてのsystem
以外のコレクションに対するデータ変更を報告します。
watchCursor = db.getSiblingDB("hr").watch()
カーソルを反復処理し、新しいイベントをチェックする。cursor.isClosed()
メソッドを cursor.tryNext()
メソッドと組み合わせて使用し、変更ストリーム カーソルが閉じられ、かつ最新のバッチにオブジェクトが残っていない場合にのみループが終了するようにします。
while (!watchCursor.isClosed()) { let next = watchCursor.tryNext() while (next !== null) { printjson(next); next = watchCursor.tryNext() } }
変更ストリーム出力の詳細なドキュメントについては、 「変更イベント」を参照してください。
注意
変更ストリームでは isExhausted()
を使用できません。