AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

Change Streams によるデータの監視

このガイドでは、変更ストリームを使用してデータに対するリアルタイムの変更を監視する方法を学習できます。 変更ストリームは、アプリケーションがコレクション、データベース、または配置のデータ変更をサブスクライブできる MongoDB Server の機能です。

MongoDB PHPライブラリを使用する場合、watch() メソッドを呼び出してMongoDB\ChangeStream のインスタンスを返すことができます。次に、 MongoDB\ChangeStreamインスタンスを反復処理して、アップデート、挿入、削除などのデータ変更を監視できます。

Tip

Atlas Stream Processing

変更ストリームの代わりに、Atlas Stream Processing を使用してデータのストリームを処理および変換できます。データベースイベントのみを登録する変更ストリームとは異なり、Atlas Stream Processing は複数のデータイベント型を管理し、拡張データプロセシング機能を提供します。この機能の詳細については、 MongoDB AtlasドキュメントのAtlas Stream Processingを参照してください。

このガイドの例では、 Atlasサンプルデータセットsample_restaurantsデータベースのrestaurantsコレクションを使用します。 PHPアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続するMongoDB\Clientをインスタンス化し、次の値を$collection変数に割り当てます。

$collection = $client->sample_restaurants->restaurants;

Tip

MongoDB配置を作成し、サンプルデータセットをロードする方法については、MongoDBの使用開始ガイドを参照してください。

一部の例では、 toJSON()関数を使用して、 BSONドキュメントである変更イベントを 拡張JSONとして表します。 この関数を使用するには、次のコードをアプリケーションファイルに貼り付けます。

function toJSON(object $document): string
{
return MongoDB\BSON\Document::fromPHP($document)->toRelaxedExtendedJSON();
}

変更ストリームを開くには、 watch()メソッドを呼び出します。 watch()メソッドを呼び出すインスタンスによって、変更ストリームが監視するイベントの範囲が決まります。 次のクラスのインスタンスでwatch()メソッドを呼び出すことができます。

  • MongoDB\Client: MongoDBデプロイのすべての変更を監視

  • MongoDB\Database:データベース内のすべてのコレクションの変更を監視

  • MongoDB\Collection:コレクションの変更を監視

次の例では、 restaurantsコレクションの変更ストリームを開き、変更が発生に応じて出力します。

$changeStream = $collection->watch();
$changeStream->rewind();
while (true) {
$changeStream->next();
if ($changeStream->valid()) {
continue;
}
$event = $changeStream->current();
echo toJSON($event), PHP_EOL;
if ($changeStream->current()['operationType'] === 'invalidate') {
break;
}
}

変更の監視を開始するには、上記のコードを実行します。 次に、別shellで、restaurantsコレクションを変更します。 次の例では、 nameフィールドの値が'Blarney Castle'であるドキュメントを更新します。

$result = $collection->updateOne(
['name' => 'Blarney Castle'],
['$set' => ['cuisine' => 'Irish']],
);

コレクションを更新すると、変更ストリームアプリケーションは変更が発生に応じて出力します。 出力される変更イベントは、次の出力のようになります。

{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" :
{ "$timestamp" : { ... } }, "wallTime" : { "$date" : "..." }, "ns" : { "db" :
"sample_restaurants", "coll" : "restaurants" }, "documentKey" : { "_id" :
{ "$oid" : "..." } }, "updateDescription" : { "updatedFields" : { "cuisine" : "Irish" },
"removedFields" : [ ], "truncatedArrays" : [ ] } }

変更ストリーム出力を変更するには、配列内のパイプラインステージをwatch()メソッドのパラメーターとして渡します。 配列には、次のステージを含めることができます。

  • $addFields または$set : ドキュメントに新しいフィールドを追加します

  • $match: ドキュメントをフィルタリングします

  • $project:ドキュメントフィールドのサブセットをプロジェクションします

  • $replaceWith または$replaceRoot : 入力ドキュメントを指定されたドキュメントで置き換え

  • $redact: ドキュメントのコンテンツを制限します

  • $unset: ドキュメントからフィールドを削除します

次の例では、 $matchステージを含むパイプラインをwatch()メソッドに渡します。 これは、アップデート操作が発生した場合にのみイベントを出力するようにwatch()メソッドに指示します。

$pipeline = [['$match' => ['operationType' => 'update']]];
$changeStream = $collection->watch($pipeline);
$changeStream->rewind();
while (true) {
$changeStream->next();
if ($changeStream->valid()) {
continue;
}
$event = $changeStream->current();
echo toJSON($event), PHP_EOL;
if ($changeStream->current()['operationType'] === 'invalidate') {
break;
}
}

Tip

ビルダを用いた操作

ビルダー パターンを使用して変更ストリームパイプラインを作成できます。詳しくは、「 ビルダによる操作 のガイド 」を参照してください。

watch()メソッドの動作を変更するには、オプション配列をパラメーターとしてwatch()に渡します。 次の表では、 配列に設定できる便利なオプションについて説明しています。

オプション
説明

fullDocument

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

fullDocumentBeforeChange

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

startAfter

watch()再開トークンで指定された操作の後に新しい変更ストリームを開始するよう、 に指示します。このフィールドにより、 無効化イベントの後に通知を再開できます。各変更ストリームのイベントドキュメントには、 フィールドとして再開トークンが含まれています。変更後に再開する操作を表す変更イベントドキュメントの
_id_id
フィールド全体を渡します。このオプションは、resumeAfter およびstartAtOperationTime と排他関係にあります。

startAtOperationTime


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

collation

変更ストリーム カーソルで使用する照合を設定します。詳細を学ぶには、このページの照合セクションを参照してください。

watch()オプションの完全なリストについては、 APIドキュメントのMongoDB $ Collection::watch()を参照してください。

重要

配置で MongoDB v 6.0以降が使用されている場合にのみ、コレクションで変更前と変更後のイメージを有効にできます。

デフォルトでは 、コレクションに対して操作を実行すると、対応する変更イベントには、その操作によって変更されたフィールドのデルタのみが含まれます。 変更前または変更後の完全なドキュメントを表示するには、配列パラメータでfullDocumentBeforeChangeまたはfullDocumentオプションをwatch()に指定します。

変更前のイメージは、変更のドキュメントの完全なバージョンです。 変更ストリーム イベントに変更前のイメージを含めるには、 fullDocumentBeforeChangeオプションを次のいずれかの値に設定します。

  • MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_WHEN_AVAILABLE: 変更イベントには、変更イベント用に変更されたドキュメントの変更前のイメージが含まれます。 変更前のイメージが利用できない場合、この変更イベントフィールドの値はnullになります。

  • MongoDB\Operation\Watch::FULL_DOCUMENT_BEFORE_CHANGE_REQUIRED: 変更イベントには、変更イベント用に変更されたドキュメントの変更前のイメージが含まれます。 変更前のイメージが利用できない場合、サーバーはエラーを発生させます。

変更後のイメージとは、変更のドキュメントの完全なバージョンです。 変更ストリーム イベントに変更後のイメージを含めるには、 fullDocumentオプションを次のいずれかの値に設定します。

  • MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP: 変更イベントには、変更後一定時間の変更されたドキュメント全体のコピーが含まれます。

  • MongoDB\Operation\Watch::FULL_DOCUMENT_WHEN_AVAILABLE: 変更イベントには、変更イベントの変更されたドキュメントの変更後のイメージが含まれます。 変更後イメージが利用できない場合、この変更イベントフィールドの値はnullになります。

  • MongoDB\Operation\Watch::FULL_DOCUMENT_REQUIRED: 変更イベントには、変更イベントの変更されたドキュメントの変更後のイメージが含まれます。 変更後のイメージが利用できない場合、サーバーはエラーを発生させます。

次の例では、コレクションでwatch()メソッドを呼び出し、 fullDocumentオプションを設定して更新されたドキュメントの変更後のイメージを含めます。

$options = ['fullDocument' => MongoDB\Operation\Watch::FULL_DOCUMENT_UPDATE_LOOKUP];
$changeStream = $collection->watch([], $options);
$changeStream->rewind();
while (true) {
$changeStream->next();
if ($changeStream->valid()) {
continue;
}
$event = $changeStream->current();
echo toJSON($event), PHP_EOL;
if ($changeStream->current()['operationType'] === 'invalidate') {
break;
}
}

別shellで実行中されている変更ストリームアプリケーションでは、前述の更新例を使用して restaurantsコレクション内のドキュメントを更新すると、次の出力のような変更イベントが出力されます。

{ "_id" : { "_data" : "..." }, "operationType" : "update", "clusterTime" :
{ "$timestamp" : { ... } }, "wallTime" : { "$date" : "..." },
"fullDocument" : { "_id" : { "$oid" : "..." }, "address" : { "building" :
"202-24", "coord" : [ -73.925044200000002093, 40.559546199999999772 ], "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" : { "$oid" : "..." } }, "updateDescription" :
{ "updatedFields" : { "cuisine" : "Irish" }, "removedFields" : [ ],
"truncatedArrays" : [ ] } }

Tip

変更前と変更後のイメージの詳細については、Change Streams MongoDB Serverマニュアルの「 とドキュメントの変更 前イメージおよび変更後イメージ 」を参照してください。

操作の 照合 を指定するには、collation オプションを設定する $options 配列パラメータを操作メソッドに渡します。照合ルールを構成する配列に collation オプションを割り当てます。

次の表では、照合を構成するために設定できるフィールドについて説明しています。

フィールド
説明

locale

(必須)Unicode 用の国際コンポーネント(ICU)ロケールを指定します。サポートされているロケールのリストについては、 MongoDB Serverマニュアルの 「照合ロケールとデフォルト パラメーター」

を参照してください。データ型:string

caseLevel

(任意)大文字と小文字の比較を含めるかどうかを指定します。

trueに設定すると、比較動作は フィールドの値によって異なります。strength

strength 1の場合、 PHPライブラリは基本文字と大文字と小文字を比較します。


- がstrength 2の場合、 PHPライブラリは基本文字、発音区別符号、その他のセカンダリ
レベルの相違、大文字と小文字を比較します。

-strength がその他の値の場合、このフィールドは無視されます。

falseに設定されている場合、 PHPライブラリには強度レベル1 または2

での大文字と小文字の比較が含まれません。データ型:bool
デフォルト:false

caseFirst



(任意)三次レベルの比較中に、大文字と小文字の相違のソート順序を指定します。データ型:string
デフォルト:"off"

strength

(任意) ICU

ドキュメントで定義されている比較のレベルを指定します。データ型:int
デフォルト:3

numericOrdering

(任意) ドライバーが数字の文字列を数値として比較するかどうかを指定します。

true に設定すると、PHP ライブラリは数字の文字列を数値として比較します。例えば、文字列「10」と「2」を比較する場合、ライブラリは文字列の数値を使用し、「10」を「2」より大きいとして処理します。

falseに設定すると、PHP ライブラリは数値型の文字列を文字列として比較します。例えば、文字列 "10" と "2" を比較する場合、ライブラリは 1 文字ずつ比較し、"10" を "2" より小さいとして取り扱います。

詳細については、MongoDB Server マニュアルの「照合制限」を参照してください。

データ型: bool
デフォルト: false

alternate

(任意) ライブラリが空白と句読点を比較目的の基本文字として考慮するかどうかを指定します。

データ型: string
デフォルト: "non-ignorable"

maxVariable

(任意) alternate"shifted"フィールドが

に設定されている場合にライブラリが無視可能と見なす文字を指定します。データ型:string
デフォルト:"punct"

backwards

(任意)発音区別符号を含む string を、string

の後ろから前にソートするかどうかを指定します。データ型:bool
デフォルト:false

照合と各フィールドに可能な値の詳細については、 MongoDB Serverマニュアルの「 照合 」エントリを参照してください。

Change Streams変更ストリームの詳細については、MongoDB Server マニュアルの 「 ストリーム」 を参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。