Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

update イベント

項目一覧

  • 概要
  • 説明
  • 動作
  • ドキュメントの変更前と変更後のイメージ
  • パスの曖昧さ回避
update

updateイベントは、操作によってコレクション内のドキュメントがアップデートされたときに発生します。

注意

曖昧さ回避

コレクション オプションが変更されたときに発生するイベントの詳細については、 modifyイベントを参照してください。

フィールド
タイプ
説明
_id
ドキュメント

変更ストリーム イベントの識別子として機能するBSONオブジェクト。 この値は、変更ストリームを再開するときにresumeAfterパラメータのresumeTokenとして使用されます。 _idオブジェクトの形式は次のとおりです。

{
"_data" : <BinData|hex string>
}

_dataタイプは、変更ストリームの開始時または再開時に MongoDB のバージョン、および場合によっては機能の互換性バージョン(FCV)によって異なります。 _dataタイプの完全なリストについては、「再開トークン」を参照してください。

resumeTokenによる変更ストリームの再開の例については、「 変更ストリームの再開 」を参照してください。

clusterTime
タイムスタンプ

イベントに関連付けられた oplog エントリのタイムスタンプ。

マルチドキュメントトランザクションに関連付けられた変更ストリーム イベントの通知では、すべて同じclusterTime値(トランザクションがコミットされた時間)が含まれます。

同じclusterTimeを持つイベントが、すべて同じトランザクションに関連するわけではありません。 一部のイベントはトランザクションにまったく関連しません。 MongoDB 8.0以降では、どの配置のイベントにも当てはまる可能性があります。 以前のバージョンでは、この動作は シャーディングされたシャーディングされたクラスター上の イベントでのみ可能でした。

単一のトランザクションのイベントを識別するには、変更ストリーム イベント ドキュメントでlsidtxnNumberの組み合わせを使用できます。

バージョン8.0で変更

collectionUUID
UUID

変更が発生したコレクションを識別するUUID

バージョン 6.0 で追加。

documentKey
ドキュメント

CRUD操作によって作成または変更されたドキュメントの_id値を含むドキュメント。

シャーディングされたコレクションの場合、このフィールドにはドキュメントの完全なシャードキーも表示されます。 _idフィールドは、すでにシャードキーの一部である場合は繰り返されません。

fullDocument
ドキュメント

CRUD操作によって作成または変更されたドキュメント。

このフィールドは、 fullDocumentupdateLookupに設定して変更ストリームを構成した場合にのみ表示されます。 updateLookupを使用して変更ストリームを構成する場合、 フィールドは更新操作によって変更されたドキュメントの、過半数がコミットした最新のバージョンを表します。 元の更新操作から完全なドキュメント検索までの間に、過半数がコミットした他の操作によってドキュメントが変更された場合、ドキュメントは update Descriptionで説明されている変更と異なる場合があります。

詳細については、「更新操作のための完全なドキュメントの検索 」を参照してください。

バージョン 6.0 での変更

MongoDB 6.0 以降では、 db.createCollection()create 、またはcollModを使用してchangeStreamPreAndPostImagesオプションを設定すると、 fullDocumentフィールドには挿入、置換、または更新された後のドキュメントが表示されます(ドキュメントがイメージ)。 fullDocumentは常にinsertイベントに含まれます。

fullDocumentBeforeChange
ドキュメント

変更が 操作によって適用される前のドキュメント。 つまり、ドキュメントの変更前のイメージです。

このフィールドは、 db.createCollection()メソッドまたはcreate } コマンドまたはcollModコマンドを使用してコレクションのchangeStreamPreAndPostImagesフィールドを有効にすると使用できます。

バージョン 6.0 で追加。

lsid
ドキュメント

トランザクションに関連付けられたセッションの識別子。

操作がマルチドキュメントトランザクションの一部である場合にのみ存在します。

ns
ドキュメント

イベントの影響を受ける名前空間(データベースと または コレクション)。

ns.coll
string

イベントが発生したコレクションの名前。

ns.db
string

イベントが発生したデータベースの名前。

operationType
string

変更通知が報告する操作のタイプ。

これらの変更イベントのupdateの値を返します。

updateDescription
ドキュメント

更新操作によって更新または削除されたフィールドを説明するドキュメント。

updateDescription.
disambiguatedPaths
ドキュメント

updateDescriptionのあいまいなフィールド記述子を明確に示すドキュメント。

update変更イベントが、パスにピリオド( . )が含まれているフィールド、またはパスに配列以外の数値サブフィールドが含まれているフィールドの変更を記述する場合、 disambiguatedPathフィールドは各エントリを一覧表示する 配列を持つドキュメントを提供します。変更されたフィールドへのパスにある。

showExpandedEventsオプションをtrueに設定する必要があります。

バージョン 6.1 で追加

updateDescription.
removedFields
配列

アップデート操作によって削除されたフィールドの配列。

updateDescription.
truncatedArrays
配列

次の 1 つ以上のステージを使用して、パイプラインベースの更新で実行された配列の切り捨てを記録するドキュメントの配列。

配列全体が置き換えられた場合、切り捨てはupdate Description.updateFields で報告されます。

updateDescription.
truncatedArrays.
field
string

切り捨てられたフィールドの名前。

updateDescription.
truncatedArrays.
newSize
integer

切り捨てられた配列内の要素の数。

updateDescription.
updatedFields
ドキュメント

アップデート操作によって変更されたフィールドに対応するキーを持つドキュメント。 各フィールドの値は、新しい値を生成した操作ではなく、それらのフィールドの新しい値に対応します。

txnNumber
NumberLong

トランザクションを一意に識別するのに役立つ数値は、 lsidと合わせて使用されます。

操作がマルチドキュメントトランザクションの一部である場合にのみ存在します。

wallTime

データベースの操作のサーバー日付と時刻。 wallTimeclusterTimeclusterTimeは と異なり、 はデータベース操作イベントに関連付けられた oplog エントリから取得されたタイムスタンプであるため、

バージョン 6.0 で追加。

MongoDB 6.0 以降では、次の手順を実行すると、ドキュメントが変更される前(または削除される)に フィールドを含むfullDocumentBeforeChangeドキュメントが表示されます。

  1. db.createCollection()create 、またはcollModを使用し、コレクションで新しいchangeStreamPreAndPostImagesフィールドを有効にします。

  2. db.collection.watch()fullDocumentBeforeChange"required"または"whenAvailable"に設定し

変更ストリーム出力のfullDocumentBeforeChangeドキュメントの例:

"fullDocumentBeforeChange" : {
"_id" : ObjectId("599af247bb69cd89961c986d"),
"userName" : "alice123",
"name" : "Alice Smith"
}

変更ストリーム出力の完全な例については、「Change Streams とドキュメントの変更前イメージおよび変更後イメージ」を参照してください。

変更ストリーム イベントにおいて、次の条件に当てはまる場合、変更前と変更後のイメージは使用できません。

  • ドキュメントの更新または削除操作時に、コレクションにおいて有効になっていない場合。

  • expireAfterSeconds で設定した、変更前と変更後のイメージ保持時間が経過した後に削除された場合。

    • 次の例では、クラスター全体でexpireAfterSeconds100秒に設定します。

      use admin
      db.runCommand( {
      setClusterParameter:
      { changeStreamOptions: {
      preAndPostImages: { expireAfterSeconds: 100 }
      } }
      } )
    • 次の例では、expireAfterSeconds を含む現在の changeStreamOptions 設定を返します。

      db.adminCommand( { getClusterParameter: "changeStreamOptions" } )
    • expireAfterSecondsoff に設定すると、デフォルトの保持ポリシーが適用されます。対応する変更ストリーム イベントがoplog から削除されるまで、変更前と変更後のイメージは保持されます。

    • 変更ストリーム イベントが oplog から削除されると、 expireAfterSeconds の変更前と変更後のイメージの保持時間にかかわらず、対応する変更前と変更後のイメージも削除されます。

その他の考慮事項

  • 変更前と変更後のイメージを有効にすると、ストレージ容量が消費され、処理時間が増えます。変更前と変更後のイメージは、必要な場合のみ有効にしてください。

  • 変更ストリーム イベントのサイズを 16 メガバイト未満に制限します。イベントのサイズを制限するには、次の方法があります。

    • ドキュメントのサイズを 8 MB に制限します。updateDescription のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、変更ストリーム出力で変更前と変更後のイメージを同時にリクエストできます。

    • updateDescription のような他の変更ストリーム イベントのフィールドがそれほど大きくない場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更後のイメージのみをリクエストしてください。

    • 次の場合、ドキュメントの変更ストリーム出力では最大 16 MB の変更前のイメージのみをリクエストしてください。

      • ドキュメントのアップデートがドキュメントの構造または内容のごく一部にしか影響しない場合、そして

      • replace 変更イベントが発生しない場合。replace イベントには、常に変更後のイメージが含まれます。

  • 変更前イメージをリクエストするには、db.collection.watch() で、fullDocumentBeforeChangerequired または whenAvailable に設定します。変更後イメージをリクエストするには、同じ方法で fullDocument を設定します。

  • 変更前のイメージは config.system.preimages コレクションに書き込まれます。

    • config.system.preimages コレクションが大きくなる場合があります。コレクションのサイズを制限するには、前述のとおり、変更前のイメージに expireAfterSeconds 時間を設定します。

    • 変更前のイメージはバックグラウンド プロセスによって非同期で削除されます。

重要

下位互換性のない機能

MongoDB 6.0 以降では、変更ストリームにドキュメントの変更前のイメージと変更後のイメージを使用している場合、以前の MongoDB バージョンにダウングレードする前に、collMod コマンドを使用して各コレクションの changeStreamPreAndPostImages を無効にする必要があります。

Tip

以下も参照してください。

バージョン 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 つの値を持つ配列が表示され、 townhomeのサブフィールドではないことを示します。

  • アップデートによって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ドキュメントは、アップデート操作とドキュメント検索の間に発生する、過半数がコミットした操作のインターリーブ数に応じて、アップデート操作の時点でのドキュメントと異なる場合があります。

戻る

shardCollection