関係
項目一覧
Overview
関係とは、2 つのドキュメント間の接続です。 関係により、ドキュメントが別々のデータベースまたはコレクションにある場合でも、読み取り操作と書込み操作で関連するドキュメントを参照してクエリを実行できます。
ソース MongoDB コレクションで関係を定義し、外部コレクション内のドキュメントにリンクします。 Atlas App Services は、ソース フィールドの値を参照する外部ドキュメントに置き換えることで、同期された SDK データモデル内の関係を自動的に解決します。
Relationships are unidirectional and don't enforce uniqueness or other foreign key constraints. ソース フィールドで存在しない外部値を参照すると、App Services は解決された関係から参照を自動的に省略します。
例
2 つのコレクションを持つアプリケーションを考えてみましょう。
accounts
コレクションには、それぞれがカスタマー アカウントを説明するドキュメントが含まれています。アカウントコレクション スキーマ{ "title": "Account", "properties": { "_id": { "bsonType": "objectId" }, "account_id": { "bsonType": "string" }, "products": { "bsonType": "array", "items": { "bsonType": "string" } }, ... } } customers
コレクションには、1 つ以上のアカウントを持つことができる 1 人のカスタマーをそれぞれ説明するドキュメントが含まれています。customers
コレクション内のすべてのドキュメントには、カスタマーに適用されるaccounts
コレクションからのすべてのaccount_id
値の配列を含むaccounts
フィールドがあります。カスタマー コレクション スキーマ{ "title": "Customer", "properties": { "username": { "bsonType": "string" }, "accounts": { "bsonType": "array", "items": { "bsonType": "string" } }, ... } }
アプリはcustomers
コレクションでこの関係を定義します。 これは、 accounts
フィールドに保存されているアカウント ID 値の配列から、 accounts
コレクション内の各ドキュメントのaccount_id
フィールドを指します。
{ "accounts": { "ref": "#/relationship/mongodb-atlas/sample_analytics/accounts", "foreign_key": "account_id", "is_list": true } }
この関係が定義されている場合、App Services はクライアント クエリでカスタマーとそのすべてのアカウントを返すことができます。 関係がない場合、クエリは完全なAccount
オブジェクトではなく、 account_id
値のみのリストを返します。
濃度
関係の 濃度 によって、参照できる外部ドキュメントの数が決まります。 App Services は、「to-one」と「to-many」の 2 つの関係濃度をサポートしています。
To-One
対 1 の関係は、各ソースドキュメントを単一のドキュメントまたは外部コレクションのドキュメントの配列のいずれかにリンクします。
関係の濃度が「対 1」であることを示すには、 is_list
をfalse
に設定します。
{ "owner": { "ref": "#/relationship/mongodb-atlas/example/people", "foreign_key": "_id", "is_list": false } }
App Services は、ソース値を参照先のオブジェクトまたは SDK モデル内の null 値に自動的に置き換えます。
{ "name": "Pet", "properties": { "name": "string", "owner": "Person" } } { "name": "Person", "properties": { "name": "string" } }
To-Many
対多の関係は、各ソース ドキュメントを外部コレクションのドキュメントのリストにリンクします。
関係が「to-many」濃度であることを示すには、 is_list
をtrue
に設定します。
{ "pets": { "ref": "#/relationship/mongodb-atlas/example/pets", "foreign_key": "_id", "is_list": true } }
App Services は、ソース値を参照先のオブジェクトまたは SDK モデル内の null 値に自動的に置き換えます。
{ "name": "Pet", "properties": { "name": "string" } } { "name": "Person", "properties": { "name": "string", "pets": "Pet[]" } }
埋め込みオブジェクトの関係
埋め込みオブジェクトは外部コレクションとの関係を持つことができます。 埋め込みオブジェクトのプロパティにアクセスするには、 ドット表記 を使用します。
別のコレクションへの埋め込みオブジェクト
埋め込みオブジェクトは、外部コレクション内のオブジェクトとの関係を持つことができます。
{ "title": "Person", "properties": { "_id": { "bsonType": "objectId" }, "pet": { "bsonType":"object", "properties": { "favoriteToyBrand": { "bsonType": "objectId" } } } // ...additional model properties } }
ドット表記 を使用して、外部コレクションとの関係を持つ埋め込みオブジェクト プロパティを指定します。 次に、外部コレクションの詳細と外部キー フィールドを指定できます。
{ "pet.favoriteToyBrand": { "ref": "#/relationship/mongodb-atlas/example/ToyBrand", "foreign_key": "_id", "is_list": false } }
リスト内の埋め込みオブジェクト
リストプロパティ内の埋め込みオブジェクトは、外部コレクションとの関係を持つことができます。
{ "title": "Person", "properties": { "_id": { "bsonType": "objectId" }, "pets": { "bsonType":"array", "items": { "bsonType": "object", "properties": { "favoriteToyBrand": { "bsonType": "objectId" } } } } // ...additional model properties } }
リストに含まれる埋め込みオブジェクト プロパティにアクセスするには、 field1.[].field2
(例: pets.[].favoriteToyBrand
)を使用します。 ここから、外部コレクションの詳細と外部キー フィールドを指定できます。
Tip
辞書とセットで同じ構文を使用する
辞書とセット内の関係を作成する場合は、この同じfield1.[].field2
構文を使用できます。
{ "pets.[].favoriteToyBrand": { "ref": "#/relationship/mongodb-atlas/example/ToyBrand", "foreign_key": "_id", "is_list": false } }
注意
関係におけるリスト、辞書、セットに対するプリミティブ
上記の例では、 is_list
は false に設定されています。 ここで、関係stringの末尾にある フィールドはプリミティブであり、リストではありません。 埋め込みオブジェクトはリストに含まれていますが、 favoriteToyBrand
プロパティ自体は辞書、セット、またはリストではありません。
関係を定義する
関係を定義するときは、次の制限に注意してください。
参照(ソース)フィールドを
_id
にすることはできません。参照(ソース)フィールドを
required
フィールドにすることはできません。Device Sync を使用している場合、外部キーは外部コレクションの
_id
フィールドである必要があります。
スキーマを定義する
関係を定義するには、ソース コレクションと外部コレクションの両方に対して定義されたスキーマが必要です。 スキーマを定義する方法については、「 スキーマの定義および強制 」を参照してください。
新しい関係の作成
スキーマと並行してリンクされた MongoDB データ ソース内のコレクションの 関係 を定義します。
新しい関係を作成するには:
左側のナビゲーション メニューで [ Schemaをクリックします。
Collectionsタブからソース コレクションを選択します。
Viewを JSON ビューに切り替え、+ Add Relationship をクリックします。
新しい関係を作成するには、関係構成オブジェクトをソース コレクションのrelationships.json
ファイルに追加します。
{ "<source field>": { "ref": "#/relationship/<data source>/<db>/<collection>", "foreign_key": "<foreign field>", "is_list": <boolean> } }
関係を設定する
関係の定義は、ソース コレクションのスキーマ内の参照フィールドから外部コレクションのスキーマ内の同じ型の外部フィールドにマップされます。
関係を設定するには
関係がマップされるソース コレクション内のフィールドを指定します。 これは、UI では親と呼ばれます。
Specify the foreign database, collection, and field in the foreign collection to map to the source field. これらは、UI ではリンクされたものと呼ばれます。 Device Sync を使用している場合、リンクされたフィールドは
_id
である必要があります。[Add] をクリックします。
関係を構成するには、 relationships.json
でソース フィールド名をルートレベル フィールドとして指定し、フィールドの値に次の構成オプションを追加します。
次の形式を使用して、
ref
フィールドに外部コレクションを指定します。#/relationship/<data source>/<db>/<collection> foreign_key
フィールドに一致するフィールドを指定します。 Device Sync を使用している場合、これは_id
である必要があります。ソースフィールドに配列が含まれている場合は、
is_list
をtrue
に設定し、それ以外の場合はfalse
に設定します。