관계 및 내장된 객체 - Node.js SDK
일대일 관계
일대일 관계는 객체가 객체 스키마에서 하나 이상의 다른 객체와 연관되어 있지 않음을 의미합니다. 일대일 관계를 정의하려면 속성 유형을 관련 Realm 객체 유형으로 지정하세요.
예시
애플리케이션은 다음 객체 스키마를 사용하여 Manufacturer
가 단일 Car
를 만들 수 있음을 나타낼 수 있습니다.
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have one car car: "Car?", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; car?: Car; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have one car car: "Car?", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
To-Many 관계
대다 관계는 객체가 특정 방식으로 여러 객체와 관련되어 있음을 의미합니다. 대다 관계를 정의하려면 객체 스키마에서 관련 Realm 객체 유형의 목록 또는 배열인 속성을 지정합니다.
예시
애플리케이션은 다음 객체 스키마를 사용하여 Manufacturer
가 여러 Car
모델을 만들 수 있음을 나타낼 수 있습니다.
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", }, }; }
역관계
역 관계는 정의된 대일 또는 대다 관계에서 해당 객체를 참조하는 다른 모든 객체에 객체를 다시 연결합니다. 관계 정의는 기본적으로 단방향입니다. 객체 모델의 속성을 역관계로 명시적으로 정의해야 합니다.
예를 들어 '제조업체에는 자동차가 많이 있음'이라는 대다 관계는 '자동차는 제조업체에 속함'이라는 역관계를 자동으로 생성하지 않습니다. 객체 모델에서 역관계를 지정하지 않으면 자동차를 만드는 제조업체를 조회하기 위해 별도의 쿼리를 실행해야 합니다.
역관계를 정의하려면 객체 모델에서 linkingObjects
속성을 정의합니다. linkingObjects
반전되는 관계의 객체 유형과 속성 이름을 지정합니다.
역관계 속성의 값은 수동으로 설정할 수 없습니다. Realm은 관련 객체를 추가하거나 제거할 때마다 암시적 관계를 자동으로 업데이트합니다.
예시
애플리케이션은 다음과 같은 객체 스키마를 사용하여 다음을 표시할 수 있습니다:
Manufacturer
는 여러Car
모델을 만들 수 있습니다각
Car
는 해당 모델을 만든Manufacturer
에게 자동으로 다시 연결되어야 합니다.
Manufacturer
객체의 cars
속성 은 Car
객체의 Realm .List 와의 대다 관계 로 정의됩니다. 여기에는 특정 제조업체의 모든 자동차가 포함됩니다.
Car
객체의 manufacturer
속성은 이 관계를 반전시킵니다. manufacturer
속성은 cars
속성에 Car
가 포함된 Manufacturer
객체를 다시 참조하도록 자동으로 업데이트됩니다.
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", manufacturer: { type: "linkingObjects", objectType: "Manufacturer", property: "cars", }, }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; manufacturer!: Realm.Collection<Manufacturer>; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", manufacturer: { type: "linkingObjects", objectType: "Manufacturer", property: "cars", }, }, }; }
역으로 연결된 객체 동적 가져오기
스키마에 linkingObjects
유형을 정의하지 않고도 역관계가 있는 객체를 동적으로 검색할 수 있습니다. 스키마에서 linkingObjects
유형을 제거하여 스키마가 표준 to-many 관계처럼 보이도록 합니다. 연결된 객체를 검색해야 하는 경우 Realm.Object.linkingObjects() 쿼리.
예시
역관계 예시에서 이어지는 다음 예시에서는 Car
스키마에서 유형이 'linkingObjects'인 manufacturer
필드를 제거했습니다. 애플리케이션 개발자는 여러 제조업체와 자동차 객체들을 생성하고, 애플리케이션은 새로 만들어진 자동차들을 제조업체의 cars
필드에 추가합니다.
특정 자동차 객체를 만드는 제조업체를 찾으려면 .linkingObjects()
메서드를 호출하고 "Manufacturer" 클래스 이름과 "cars" 필드를 매개 변수로 전달합니다.
.linkingObjects()
메서드는 관계를 반전시키는 속성을 가진 객체들의 결과 collection을 반환합니다. 이 예시에서는 Sentra 자동차 모델을 만드는 제조업체가 한 곳뿐이므로 해당 제조업체의 이름은 Nissan이 될 것으로 예상할 수 있습니다.
const carObjects = realm.objects(Car); // Get the Manufacturer who makes the Car const linkedManufacturer = carObjects[0].linkingObjects( "Manufacturer", "cars" )[0]; expect(linkedManufacturer.name).toBe("Nissan");
const carObjects = realm.objects<Car>(Car); // Get the Manufacturer who makes the Car const linkedManufacturer: Manufacturer = carObjects[0].linkingObjects<Manufacturer>("Manufacturer", "cars")[0]; expect(linkedManufacturer.name).toBe("Nissan");
내장된 객체
포함된 객체는 복잡한 데이터를 모델링하는 특수한 유형의 Realm 객체 입니다. 또한 MongoDB document model 에 더 자연스럽게 매핑됩니다. 포함된 객체는 관계 와 유사하지만 추가 제약 조건을 제공합니다.
Realm은 각 내장된 객체를 상위 객체 내부에 중첩된 데이터로 취급합니다. 내장된 객체는 상위 객체의 라이프사이클을 상속합니다. 독립적인 Realm 객체로 존재할 수 없습니다. 즉, 내장된 객체는 프라이머리 키를 가질 수 없습니다. Realm은 상위 객체가 삭제되면 내장된 객체도 자동으로 삭제합니다.
팁
재사용 및 구성 가능한 내장된 객체 유형
여러 상위 객체 유형에 동일한 내장된 객체 유형을 사용할 수 있습니다. 다른 내장된 객체 안에 객체를 포함할 수도 있습니다. 또한 내장된 객체 유형을 선택적 속성으로 자체적 정의를 활용해 재귀적으로 참조할 수도 있습니다.
Realm 객체 모델
Realm 객체 모델이 내장된 객체를 정의하도록 지정하려면 embedded
을 true
로 설정합니다. 관계를 정의하는 것처럼 부모 객체 유형에서 내장된 객체 유형을 참조합니다.
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", cars: "Car[]", // Embed an array of objects warranties: "Warranty[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", // Embed one object warranty: "Warranty?", }, }; } class Warranty extends Realm.Object { static schema = { name: "Warranty", embedded: true, properties: { name: "string", termLength: "int", cost: "int", }, }; }
class Manufacturer extends Realm.Object { _id!: BSON.ObjectId; name!: string; cars!: Realm.List<Car>; warranties!: Realm.List<Warranty>; static schema: ObjectSchema = { name: "Manufacturer", properties: { _id: "objectId", name: "string", cars: "Car[]", // Embed an array of objects warranties: "Warranty[]", }, }; } class Car extends Realm.Object { _id!: BSON.ObjectId; model!: string; miles?: number; warranty?: Warranty; static schema: ObjectSchema = { name: "Car", properties: { _id: "objectId", model: "string", miles: "int?", // Embed one object warranty: "Warranty?", }, }; } class Warranty extends Realm.Object { name!: string; termLength!: number; cost!: number; static schema: ObjectSchema = { name: "Warranty", embedded: true, properties: { name: "string", termLength: "int", cost: "int", }, }; }
JSON Schema
내장된 객체는 상위 유형의 스키마에서 내장된 문서에 매핑됩니다. 이 동작은 자체 MongoDB 컬렉션에 매핑되는 일반 Realm 객체와 다릅니다.
{ "title": "Contact", "bsonType": "object", "required": ["_id"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "Business", "bsonType": "object", "required": ["_id", "name"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }