관계
개요
관계는 두 문서 사이의 연결입니다. 관계를 사용하면 문서가 별도의 데이터베이스나 컬렉션에 있는 경우에도 읽기 및 쓰기 작업에서 관련 문서를 참조하고 쿼리할 수 있습니다.
소스 MongoDB 컬렉션에서 관계를 정의하고 외부 컬렉션의 문서에 연결합니다. Atlas App Services는 소스 필드의 값을 참조하는 외부 문서로 대체하여 동기화된 SDK 데이터 모델의 관계를 자동으로 확인합니다.
관계는 단방향이며 고유성이나 기타 외부 키 제약 조건을 적용하지 않습니다. 소스 필드에서 존재하지 않는 외부 값을 참조하는 경우 App Services는 확인된 관계에서 참조를 자동으로 생략합니다.
예시
두 개의 컬렉션이 있는 애플리케이션을 예로 들어 보겠습니다:
accounts
컬렉션에는 각각 고객 계정을 설명하는 문서가 포함되어 있습니다.계정 컬렉션 스키마{ "title": "Account", "properties": { "_id": { "bsonType": "objectId" }, "account_id": { "bsonType": "string" }, "products": { "bsonType": "array", "items": { "bsonType": "string" } }, ... } } customers
컬렉션에는 각각 하나 이상의 계정을 가질 수 있는 단일 고객을 설명하는 문서가 포함되어 있습니다.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', 이렇게 두 가지 관계 카디널리티를 지원합니다.
To-One
'to-one' 관계는 각 소스 문서를 단일 문서 또는 외부 컬렉션의 문서 배열과 연결합니다.
관계에 'to-one' 카디널리티가 있음을 나타내려면 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' 관계는 각 소스 문서를 외부 컬렉션의 문서 목록과 연결합니다.
관계에 '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
). 여기에서 외부 컬렉션 세부 정보 및 외부 키 필드를 지정할 수 있습니다.
팁
사전과 세트에 동일한 구문 사용
사전 및 세트 내에서 관계를 생성할 때 이와 동일한 field1.[].field2
구문을 사용할 수 있습니다.
{ "pets.[].favoriteToyBrand": { "ref": "#/relationship/mongodb-atlas/example/ToyBrand", "foreign_key": "_id", "is_list": false } }
참고
관계 내 기본(Primitives) vs 목록, 사전 및 세트
위의 예에서는 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에서는 상위 항목 이라고 합니다.
소스 필드에 매핑할 외부 데이터베이스, 컬렉션 및 외부 컬렉션의 필드를 지정합니다. 이를 UI에서는 연결된 라고 합니다. Device Sync를 사용하는 경우 연결된 필드가
_id
이어야 합니다 .Add를 클릭합니다.
관계를 구성하려면 relationships.json
에서 소스 필드 이름을 루트 수준 필드로 지정한 다음 필드 값에 다음 구성 옵션을 추가합니다.
다음 형식을 사용하여
ref
필드 에 외부 컬렉션 을 지정합니다.#/relationship/<data source>/<db>/<collection> foreign_key
필드에 일치시킬 필드를 지정합니다. Device Sync를 사용하는 경우 이 값이_id
이어야 합니다 .소스 필드 에 배열 이 포함된 경우
is_list
을true
로 설정하다 하고, 그렇지 않으면false
로 설정하다 합니다.