イベント ライブラリ
Overview
イベント ライブラリを使用すると、開発者は Device Sync 対応のモバイル アプリケーションの使用中にユーザーが表示および編集するデータを追跡できます。 イベント ライブラリは、次の 3 種類のイベントを記録できます。
読み取り イベント
書込み (write) イベント
カスタム イベント
開発者は、記録する読み取りトランザクションと書込みトランザクションを指定できます。 さらに、カスタム イベントを設定して、ボタンの押し方やユーザーがフロントエンド アプリケーションで表示されている内容を記録できます。
このレベルの詳細により、監査者やその他の関係者は、何が起こるか、またいつ発生したかを正確に評価できるようになります。
重要
必要なパーティションベースの同期
イベント ライブラリは、Flexible Sync を使用した AuditEvents
の記録をサポートしていません。 この機能では、 パーティションベースの同期App Services Appが AuditEvent
データをレコードする必要があります。
ユースケース
Event ライブラリは、医療サービスや金融サービスなどの頻繁にリスト化されたセカンダリのコンプライアンス要件を満たすために、監査を実行する機能を提供します。
例
医療施設の従業員は、イベント ライブラリが有効になっているアプリを使用しています。 このアプリは、リアルタイムのバイナル署名、医療デバイスからストリーミングされた情報、および人の履歴サービス情報をナースに表示します。 このアプリは、表示されるデータに基づいてナースが実行してはいけないアクションをブロックするため、本質的にコンプライアンスを強制します。 イベント ライブラリは、ナースがアプリ インターフェース内で表示するすべての情報と、その情報を表示した後に読み取るアクションをキャプチャします。
ある時点で、このナースはクライアントの処理を提供し、その後、その機能を不正請求で公開します。 法定代理人は、処理中にナープが利用した情報を確認する必要があります。
イベント ライブラリは、ナースが処理中に表示したデジタル データと、オペレーターが実行したアクションをキャプチャします。 このデータを確認することで、法定チームは処理が合理的かどうかを評価できます。 この情報がないと、法定代理人は従業員のアクションが合理的かどうかを判断して証明することができません。
仕組み
イベント ライブラリは、ユーザーのデバイス上に別の「イベント」Realm を開きます。 このRealmは、開発者が Event ライブラリを使用して監視することを選択したユーザー レルムにアクセスできます。
開発者がイベント ライブラリを実装するとき、レコードするイベントのタイプと、イベント レコードに追加するカスタム メタデータを指定します。 クライアント アプリケーションの実行時に、指定されたユーザー インタラクションが "イベント" レルムに、読み取りイベント、書込みイベント、またはカスタム イベントとして記録されます。
クライアント デバイスがネットワークに接続している間、Atlas Device Sync はこのイベント Realm データをリンクされた Atlas データソース内のAuditEvent
コレクションに同期します。
イベント ライブラリ データにアクセスする
イベント ライブラリは、リンクされた Atlas database 内のAuditEvent
と呼ばれるコレクションにイベント データを記録します。 イベント ライブラリを構成すると、開発モードを使用してこのコレクションを自動的に作成し、同期されたイベントからスキーマを生成します。 アプリケーションを本番環境に移行する前に、必ず開発モードをオフにしてください。
イベント ライブラリ スキーマ
AuditEvent
コレクションには、次のフィールドを含む スキーマ が必要です。
フィールド名 | タイプ | 必須 |
---|---|---|
_id | ObjectId | 必須 |
activity | 文字列 | 必須 |
_partition | 文字列 | 必須 |
timestamp | 日付 | 必須 |
event | 文字列 | 任意 |
data | 文字列 | 任意 |
さらに、スキーマには、使用するメタデータ キーごとに任意の string フィールドが含まれている必要があります。 例:
{ "<Metadata Key>": { "bsonType": "string" } }
例
カスタム メタデータを使用していない場合、スキーマは次のようになります。
{ "title": "AuditEvent", "bsonType": "object", "required": [ "_id", "_partition", "timestamp", "activity" ], "properties": { "_id": { "bsonType": "objectId" }, "_partition": { "bsonType": "string" }, "timestamp": { "bsonType": "date" }, "activity": { "bsonType": "string" }, "event": { "bsonType": "string" }, "data": { "bsonType": "string" } } }
イベントの種類
イベント ライブラリは、次の 3 種類のイベントを記録します。
読み取り イベント
書込み (write) イベント
カスタム イベント
読み取りイベント
イベント ライブラリは、クエリの結果として返されたデータを読み取りイベントとして記録します。 読み取りイベントは、リンクを追跡する場合や、プライマリキーでオブジェクトを検索する場合など、Realm オブジェクトがインスタンス化されるたびに記録されます。
イベント ライブラリは、読み取りイベントを 2 つのフィールドを持つ JSON オブジェクトとして記録します。
type
: クラス名を保存しますvalue
: シリアル化されたオブジェクトの配列を保存します
読み取りイベントは次のように 値を保存します。
単一オブジェクト読み取りイベント: 値は単一の要素を持つ配列です
クエリに一致するオブジェクト: オブジェクトが使用されていない場合でも、値はクエリに一致するすべてのオブジェクトの配列
書込みトランザクション (write transaction)中に発生する読み取り。 値は、書込みトランザクション (write transaction) が開始される前にオブジェクトが持っていたデータです。書込み (write) イベント中に発生した変更は反映されません。
書込みトランザクションの開始時に存在しないオブジェクト: 書込みトランザクションで作成されたオブジェクトは、読み取りイベントを生成しません。
重要
Event ライブラリは、クエリのサブセットのみがクライアント アプリケーションに表示されるかどうかを判断できません。 たとえば、クライアント アプリケーションにリストビューがあるとします。 イベント ライブラリの読み取りイベントはスクロール情報を記録しません。読み取りイベントを完全なクエリ結果として記録します。 開発者は、クライアント アプリケーションがクエリ結果のサブセットのみを表示する場合に、カスタム イベントを使用してレコードする必要があります。
読み取りイベントの組み合わせ
すべての読み取りイベントのストリームは、情報を追加しない同じオブジェクトに対して多くの「重複」イベントを生成する可能性があります。 これらの「重複」イベントを減らすために、イベント ライブラリはいくつかのイベントを破棄してマージします。
イベント ライブラリは以下を破棄します。
一致するオブジェクトがないクエリ
新しく作成されたオブジェクトのみに一致するクエリ
オブジェクトは、オブジェクトが以前のクエリに一致するものを読み取る
イベント ライブラリは以下をマージします。
同じテーブルに対する複数のクエリを 1 つのマージされたクエリに。
読み取りイベント形式
読み取りイベント オブジェクトの形式は次のとおりです。
{ "_id": "62b396f4ebe94d2b871889bb", "_partition":"events-62b396f4ebe94d2b871889ba", "activity":"read object", "data": "{ "type":"Person", "value": [{ "_id": "62b396f4ebe94d2b871889b9", "_partition":"", "employeeId":1, "name":"Anthony" }] }", "event":"read", "timestamp": 2022-06-23T14:54:37.756+00:00 }
埋め込みオブジェクト読み取りイベント
イベント ライブラリは、埋め込みオブジェクトのプライマリキーへのリンクを親オブジェクトに作成することで、埋め込みオブジェクトを表します。 ユーザーがリンクを実行しない場合、プライマリキーは埋め込みオブジェクトの唯一の表現となります。 ユーザーが リンクを実行すると、埋め込みオブジェクトは親オブジェクト内で解決されます。
これにより、埋め込みオブジェクトの最上位オブジェクト読み取りも生成されます。
例
Person
オブジェクトには埋め込みオブジェクトOffice
があり、このオブジェクトには従業員が作業する場所に関する詳細が含まれています。 office
の詳細を表示するために リンクを実行しない場合、親のPerson
オブジェクトには埋め込みオブジェクトのオブジェクト ID のみが表示されます。
{ "type": "Person", "value": [{ "_id": "62b47624265ff7b58e9b204e", "_partition": "", "employeeId": 1, "name": "Michael Scott", "office": "62b47624265ff7b58e9b204f" }] }
リンクに従って埋め込まれたOffice
オブジェクトの詳細を表示すると、親オブジェクト内の埋め込みオブジェクトが解決されます。 また、子オブジェクトのみ(この場合はOffice
オブジェクト)の 2 番目の最上位読み取りも生成します。
{ "type":"Person", "value": [{ "_id": "62b47975a33224558bdf8b4d", "_partition": "", "employeeId": 1, "name": "Michael Scott", "office": { "_id": "62b47975a33224558bdf8b4e", "_partition": "", "city": "Scranton", "locationNumber": 123, "name": "Dunder Mifflin" } }] } { "type": "Office", "value": [{ "_id": "62b47975a33224558bdf8b4e", "_partition": "", "city": "Scranton", "locationNumber": 123, "name": "Dunder Mifflin" }] }
注意
読み取りイベントの組み合わせ
読み取りイベントの組み合わせにより、オブジェクトをクエリし、その後埋め込みオブジェクト リンクを追跡するときに表示されるオブジェクトに影響する可能性があります。
上記の例では、以前に Person
をクエリしていた場合、これによってオフィス オブジェクトが のユーザー オブジェクト内で解決されない読み取りイベントが生成されます。最初の読み取りイベントにはObjectIdのみが表示されます。 その後、埋め込みオブジェクトを解決するリンクを後で追跡すると、埋め込みオブジェクトに対して個別の最上位の読み取りが表示されますが、親オブジェクト内の解決された埋め込みオブジェクトを表示する親オブジェクトの読み取りは行われません。
書込み (write) イベント
イベント ライブラリは、次の場合に書込み (write) イベントを記録します。
新しいオブジェクトが作成されます
既存のオブジェクトが変更されます
オブジェクトが削除されます
書込み (write) イベントは、オブジェクトの変更前と変更後の状態の両方を記録します。 作成された新しいオブジェクトの場合、 前の 状態はnull
です。 削除の場合、オブジェクトの変更後の状態はnull
です。
イベント ライブラリは、イベント ライブラリが 1 つの書込みイベントを記録します。 この書込みイベントは、書込みトランザクション中に行われたすべての変更を記録します。
ペイロードは、クラス名でキー付けされたオブジェクトです。 オブジェクトが作成、変更、または削除された各オブジェクトタイプには、エントリがあります。
イベント ライブラリは、オブジェクトタイプに対する変更を、3 つの配列を持つオブジェクトとして記録します。
挿入: 読み取りと同じ直列化スキームを使用して、挿入された直列化されたオブジェクトを含む
変更: 各プロパティの古い値と新しい値の両方を報告
削除: 読み取りと同じ直列化スキームを使用して、削除された直列化されたオブジェクトを含む
変更では、 newValue
オブジェクトにはoldValue
オブジェクトと異なるプロパティのみが含まれます。 書込みトランザクションがオブジェクトに割り当てても、実際にはプロパティの値を変更しない場合、
書込み (write) イベント形式
書込み (write) イベント オブジェクトの形式は次のとおりです。
{ "Person": { "insertions": [{ "_id": "62b47ead6a178a314ae0eb52", "_partition": "", "employeeId": 1, "name": "Anthony" }] } }
{ "Person":{ "modifications": [{ "newValue": { "name": "Tony" }, "oldValue": { "_id": "62b47d83cdac49f904c5737b", "_partition": "", "employeeId": 1, "name": "Anthony" } }] } }
{ "Person":{ "deletions":[{ "_id":"62b47ead6a178a314ae0eb52", "_partition":"", "employeeId":1, "name":"Tony", "userId":"tony.stark@starkindustries.com" }] } }
カスタム イベント
カスタム イベントでは、次のようなデータベースへの読み取りや書き込みを行わないタイプのイベントを記録できます。
特定の画面が表示された場合
ユーザーがボタンをクリックしたとき
カスタム イベントを使用して、クライアントアプリケーションが特定の画面を表示するときにカスタムイベントを記録するなど、イベントの読み取りや書き込みにコンテキストを付与できます。 次に、アプリ画面のロードを記録したカスタム イベントがそのアプリ画面ですべて発生した後に、読み取りイベントと書込みイベントが推測できます。
カスタム イベントでは、開発者が必要なデータを保存することも、データをまったく保存しないこともできます。
{ "_id": "62b4804c15659310991e5e0a", "_partition": "events-62b4804b15659310991e5e09", "activity": "login", "event": "custom event", "timestamp": 2022-06-23T15:01:31.941+00:00 }