定義
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と排他関係にあります。fullDocumentstring
任意。 デフォルトでは 、アップデートされたドキュメント全体ではなく、
db.watch()アップデート操作によって変更されたフィールドのデルタが返されます。fullDocumentを"updateLookup"db.watch()に設定すると、更新されたドキュメントの過半数がコミットした最新のバージョンを参照するよう に指示します。db.watch()fullDocumentは、updateDescriptionデルタに加えて、ドキュメント検索を含む フィールドを返します。MongoDB 6.0 以降では、
fullDocumentを次のように設定できます。"whenAvailable"これは、ドキュメントの挿入、置換、または更新後に、利用可能な場合、ドキュメントの変更後のイメージを出力するためです。"required"ドキュメントの挿入、置換、またはアップデート後に、ドキュメントの変更後のイメージを出力します。変更後のイメージが利用できない場合、エラーが発生します。
fullDocumentBeforeChangestring
任意。デフォルトは、
"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と排他関係にあります。次の値を返します。 変更イベント ドキュメント上のカーソル。 変更イベント ドキュメントの例については、「変更イベント」を参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
可用性
配置
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() を使用できません。