Docs Menu
Docs Home
/ /
Atlas App Services
/

関係

項目一覧

  • Overview
  • 濃度
  • To-One
  • To-Many
  • 埋め込みオブジェクトの関係
  • 別のコレクションへの埋め込みオブジェクト
  • リスト内の埋め込みオブジェクト
  • 関係を定義する
  • スキーマを定義する
  • 新しい関係の作成
  • 関係を設定する
  • 関係の配置

関係とは、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 つの関係濃度をサポートしています。

対 1 の関係は、各ソースドキュメントを単一のドキュメントまたは外部コレクションのドキュメントの配列のいずれかにリンクします。

関係の濃度が「対 1」であることを示すには、 is_listfalseに設定します。

data_sources/mongodb-atlas/example/pets/relationships.json
{
"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」濃度であることを示すには、 is_listtrueに設定します。

data_sources/mongodb-atlas/example/people/relationships.json
{
"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フィールドである必要があります。

1

関係を定義するには、ソース コレクションと外部コレクションの両方に対して定義されたスキーマが必要です。 スキーマを定義する方法については、「 スキーマの定義および強制 」を参照してください。

2

スキーマと並行してリンクされた MongoDB データ ソース内のコレクションの 関係 を定義します。

新しい関係を作成するには:

  1. 左側のナビゲーション メニューで [ Schemaをクリックします。

  2. Collectionsタブからソース コレクションを選択します。

  3. Viewを JSON ビューに切り替え、+ Add Relationship をクリックします。

新しい関係を作成するには、関係構成オブジェクトをソース コレクションのrelationships.jsonファイルに追加します。

{
"<source field>": {
"ref": "#/relationship/<data source>/<db>/<collection>",
"foreign_key": "<foreign field>",
"is_list": <boolean>
}
}
3

関係の定義は、ソース コレクションのスキーマ内の参照フィールドから外部コレクションのスキーマ内の同じ型の外部フィールドマップされます。

関係を設定するには

  1. 関係がマップされるソース コレクション内のフィールドを指定します。 これは、UI ではと呼ばれます。

  2. Specify the foreign database, collection, and field in the foreign collection to map to the source field. これらは、UI ではリンクされたものと呼ばれます。 Device Sync を使用している場合、リンクされたフィールドは_idである必要があります。

  3. [Add] をクリックします。

関係を構成するには、 relationships.jsonでソース フィールド名をルートレベル フィールドとして指定し、フィールドの値に次の構成オプションを追加します。

  • 次の形式を使用して、 refフィールドに外部コレクションを指定します。

    #/relationship/<data source>/<db>/<collection>
  • foreign_keyフィールドに一致するフィールドを指定します。 Device Sync を使用している場合、これは_idである必要があります。

  • ソースフィールドに配列が含まれている場合は、 is_listtrueに設定し、それ以外の場合はfalseに設定します。

4

[ Saveをクリックし、更新されたアプリケーションを配置します。

関係構成ファイルを保存し、変更をプッシュして配置します。

appservices push

戻る

スキーマデータ型