update
イベント
概要
説明
フィールド | タイプ | 説明 | |||
---|---|---|---|---|---|
_id | ドキュメント | 変更ストリーム イベントの識別子として機能するBSONオブジェクト。 この値は、変更ストリームを再開するときに
| |||
clusterTime | タイムスタンプ | イベントに関連付けられた oplog エントリのタイムスタンプ。 マルチドキュメントトランザクションに関連付けられた変更ストリーム イベントの通知では、すべて同じ シャーディングされたクラスターでは、同じ 単一のトランザクションのイベントを識別するには、変更ストリーム イベント ドキュメントで | |||
collectionUUID | UUID | 変更が発生したコレクションを識別するUUID 。 バージョン 6.0 で追加。 | |||
documentKey | ドキュメント | CRUD操作によって作成または変更されたドキュメントの シャーディングされたコレクションの場合、このフィールドにはドキュメントの完全なシャードキーも表示されます。 | |||
fullDocument | ドキュメント | CRUD操作によって作成または変更されたドキュメント。 このフィールドは、 詳細については、「更新操作のための完全なドキュメントの検索 」を参照してください。 バージョン 6.0 での変更。 MongoDB 6.0 以降では、 | |||
fullDocumentBeforeChange | ドキュメント | 変更が 操作によって適用される前のドキュメント。 つまり、ドキュメントの変更前のイメージです。 このフィールドは、 バージョン 6.0 で追加。 | |||
lsid | ドキュメント | トランザクションに関連付けられたセッションの識別子。 | |||
ns | ドキュメント | イベントの影響を受ける名前空間(データベースと または コレクション)。 | |||
ns.coll | string | イベントが発生したコレクションの名前。 | |||
ns.db | string | イベントが発生したデータベースの名前。 | |||
operationType | string | 変更通知が報告する操作のタイプ。 これらの変更イベントの | |||
updateDescription | ドキュメント | 更新操作によって更新または削除されたフィールドを説明するドキュメント。 | |||
updateDescription. disambiguatedPaths | ドキュメント |
showExpandedEventsオプションを バージョン 6.1 で追加。 | |||
updateDescription. removedFields | 配列 | アップデート操作によって削除されたフィールドの配列。 | |||
updateDescription. truncatedArrays | 配列 | 次の 1 つ以上のステージを使用して、パイプラインベースの更新で実行された配列の切り捨てを記録するドキュメントの配列。 配列全体が置き換えられた場合、切り捨てはupdate Description.updateFields で報告されます。 | |||
updateDescription. truncatedArrays. field | string | 切り捨てられたフィールドの名前。 | |||
updateDescription. truncatedArrays. newSize | integer | 切り捨てられた配列内の要素の数。 | |||
updateDescription. updatedFields | ドキュメント | アップデート操作によって変更されたフィールドに対応するキーを持つドキュメント。 各フィールドの値は、新しい値を生成した操作ではなく、それらのフィールドの新しい値に対応します。 | |||
txnNumber | NumberLong | トランザクションを一意に識別するのに役立つ数値は、 lsidと合わせて使用されます。 | |||
wallTime | データベースの操作のサーバー日付と時刻。 バージョン 6.0 で追加。 |
動作
ドキュメントの変更前と変更後のイメージ
MongoDB 6.0 以降では、次の手順を実行すると、ドキュメントが変更される前(または削除される)に フィールドを含むfullDocumentBeforeChange
ドキュメントが表示されます。
db.createCollection()
、create
、またはcollMod
を使用し、コレクションで新しいchangeStreamPreAndPostImages
フィールドを有効にします。db.collection.watch()
でfullDocumentBeforeChange
を"required"
または"whenAvailable"
に設定し 。
変更ストリーム出力のfullDocumentBeforeChange
ドキュメントの例:
"fullDocumentBeforeChange" : { "_id" : ObjectId("599af247bb69cd89961c986d"), "userName" : "alice123", "name" : "Alice Smith" }
変更ストリーム出力の完全な例については、「Change Streams とドキュメントの変更前イメージおよび変更後イメージ」を参照してください。
変更ストリーム イベントにおいて、次の条件に当てはまる場合、変更前と変更後のイメージは使用できません。
ドキュメントの更新または削除操作時に、コレクションにおいて有効になっていない場合。
expireAfterSeconds
で設定した、変更前と変更後のイメージ保持時間が経過した後に削除された場合。次の例では、クラスター全体で
expireAfterSeconds
を100
秒に設定します。use admin db.runCommand( { setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: 100 } } } } ) 次の例では、
expireAfterSeconds
を含む現在のchangeStreamOptions
設定を返します。db.adminCommand( { getClusterParameter: "changeStreamOptions" } ) expireAfterSeconds
をoff
に設定すると、デフォルトの保持ポリシーが適用されます。対応する変更ストリーム イベントがoplog から削除されるまで、変更前と変更後のイメージは保持されます。変更ストリーム イベントが oplog から削除されると、
expireAfterSeconds
の変更前と変更後のイメージの保持時間にかかわらず、対応する変更前と変更後のイメージも削除されます。
その他の考慮事項
変更前と変更後のイメージを有効にすると、ストレージ容量が消費され、処理時間が増えます。変更前と変更後のイメージは、必要な場合のみ有効にしてください。
変更ストリーム イベントのサイズを 16 メガバイト未満に制限します。イベントのサイズを制限するには、次の方法があります。
ドキュメントのサイズを 8 MB に制限します。
updateDescription
のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、変更ストリーム出力で変更前と変更後のイメージを同時にリクエストできます。updateDescription
のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更後のイメージのみをリクエストしてください。次の場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更前のイメージのみをリクエストしてください。
ドキュメントのアップデートがドキュメントの構造または内容のごく一部にしか影響しない場合、そして
replace
変更イベントが発生しない場合。replace
イベントには、常に変更後のイメージが含まれます。
変更前イメージをリクエストするには、
db.collection.watch()
で、fullDocumentBeforeChange
をrequired
またはwhenAvailable
に設定します。変更後イメージをリクエストするには、同じ方法でfullDocument
を設定します。変更前のイメージは
config.system.preimages
コレクションに書き込まれます。config.system.preimages
コレクションが大きくなる場合があります。コレクションのサイズを制限するには、前述のとおり、変更前のイメージにexpireAfterSeconds
時間を設定します。変更前のイメージはバックグラウンド プロセスによって非同期で削除されます。
重要
下位互換性のない機能
MongoDB 6.0 以降では、変更ストリームにドキュメントの変更前のイメージと変更後のイメージを使用している場合、以前の MongoDB バージョンにダウングレードする前に、collMod
コマンドを使用して各コレクションの changeStreamPreAndPostImages を無効にする必要があります。
Tip
以下も参照してください。
変更ストリーム イベントと出力については、「変更イベント」を参照してください。
コレクションの変更を監視するには、
db.collection.watch()
を参照してください。変更ストリーム出力の完全な例については、「Change Streams とドキュメントの変更前イメージおよび変更後イメージ」を参照してください。
パスの曖昧さ回避
バージョン 6.1 で追加。
updateDescription
フィールドは、操作によってドキュメント内の特定のフィールドに加えられた変更を記録します。 これらのフィールド記述子は、パス区切り文字としてドット( .
)を使用し、配列インデックスとして数値を使用するため、ドットまたは数値を使用するフィールド名が含まれている場合はぼかして表示されます。
update
イベントがあいまいなフィールドに関係する変更を報告する場合、 disambiguatedPaths
ドキュメントは各パス コンポーネントをリストする配列を持つパスキーを提供します。
注意
disambiguatedPaths
フィールドはshowExpandedEventsオプションで開始された変更ストリームでのみ使用できます
たとえば、人物とその人が住んでいる都市を列挙するドキュメントを考えてみましょう。
{ "name": "Anthony Trollope", "home.town": "Oxford", "residences": [ {"0": "Oxford"}, {"1": "Sunbury"} ] }
アップデートによって
home.town
フィールドがOxford
からLondon
に変更されると、次のようなアップデートの説明が生成されます。"updateDescription": { "updatedFields": { "home.town": "London" }, "disambiguatedPaths": { "home.town": [ "home.town" ] } } フィールド
home.town
には期間が含まれているため、disambiguatedPaths
フィールドには 1 つの値を持つ配列が表示され、town
がhome
のサブフィールドではないことを示します。アップデートによって
residences
配列の値が変更され、同じ変更が行われると、次のようなアップデートの説明が生成されます。"updateDescription": { "updatedFields": { "residences.0.0": "London" }, "disambiguatedPaths": { "residences.0.0": [ "residences", 0, "0" ] } } 明確なパスには、配列インデックスを示す整数
0
とネストされたドキュメント内のフィールド名を示すstring"0"
が含まれます。
disambiguatedPath
に数値フィールドが含まれていない場合は 2 つあります。
パスの最初のフィールドが数字の string(
0.name
)。 最初のフィールドは配列インデックスにできないため、これはあいまいではありません。数値 string フィールドの先頭にゼロがある場合(つまり
0001
)。 整数には先頭にゼロがあることができないため、これはあいまいではありません。
例
次の例では、 update
イベントを示しています。
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ] } }
次の例では、 fullDocument : updateLookup
オプションを使用して開かれた変更ストリームのupdate
イベントを示しています。
{ "_id": { <Resume Token> }, "operationType": "update", "clusterTime": <Timestamp>, "wallTime": <ISODate>, "ns": { "db": "engineering", "coll": "users" }, "documentKey": { "_id": ObjectId("58a4eb4a30c75625e00d2820") }, "updateDescription": { "updatedFields": { "email": "alice@10gen.com" }, "removedFields": ["phoneNumber"], "truncatedArrays": [ { "field" : "vacation_time", "newSize" : 36 } ], "disambiguatedPaths": { } }, "fullDocument": { "_id": ObjectId("58a4eb4a30c75625e00d2820"), "name": "Alice", "userName": "alice123", "email": "alice@10gen.com", "team": "replication" } }
fullDocument
ドキュメントは、更新されたドキュメントの過半数がコミットした最新のバージョンを表します。 fullDocument
ドキュメントは、アップデート操作とドキュメント検索の間に発生する、過半数がコミットした操作のインターリーブ数に応じて、アップデート操作の時点でのドキュメントと異なる場合があります。