Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
지원되는 데이터 유형

내장된 객체 - .NET SDK

내장된 객체 는 특정 객체 에 대한 복잡한 데이터를 모델링하는 특수한 유형의 Realm 객체 입니다. 포함된 객체는 관계 와 유사하지만 추가 제약 조건을 제공하고 비정규화된 MongoDB document model 에 더 자연스럽게 매핑됩니다.

Realm은 내장된 객체를 단일 특정 상위 객체 내부의 중첩 데이터로 처리한다는 고유한 소유권 제약 조건을 적용합니다. 내장된 객체는 상위 객체의 라이프사이클을 상속하며 독립적인 Realm 객체로 존재할 수 없습니다. Realm은 상위 객체가 삭제되거나 새로운 내장된 객체 인스턴스로 덮어쓰면 내장된 객체를 자동으로 삭제합니다.

참고

Realm은 내장된 객체에 계단식 삭제를 사용함

Realm 객체를 삭제하면 Realm은 해당 객체가 참조하는 모든 내장된 객체를 자동으로 삭제합니다. 상위 객체를 삭제한 후에도 애플리케이션에서 유지해야 하는 모든 객체는 대신 관계를 사용해야 합니다.

Realm 객체 모델 또는 서버 측 문서 스키마 사용하여 내장된 객체 유형을 정의할 수 있습니다. 포함된 객체 유형은 재사용 및 구성 가능한 입니다. 여러 상위 객체 유형에 동일한 내장된 객체 유형을 사용할 수 있으며 다른 포함된 객체 내에 객체를 포함할 수 있습니다.

중요

내장된 객체는 프라이머리 키를 가질 수 없습니다.

내장된 객체를 정의하려면 IEmbeddedObject 인터페이스를 구현합니다. 관계를 정의하는 것과 같은 방식으로 상위 객체 유형에서 내장된 객체 유형을 참조할 수 있습니다.

Address가 내장된 객체인 다음 예시를 살펴보겠습니다. ContactBusiness 클래스는 모두 Address를 내장된 객체로 참조합니다.

public partial class Address : IEmbeddedObject
{
[MapTo("street")]
public string Street { get; set; }
[MapTo("city")]
public string City { get; set; }
[MapTo("country")]
public string Country { get; set; }
[MapTo("postalCode")]
public string PostalCode { get; set; }
}
public partial class Contact : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("_partition")]
public string Partition { get; set; }
[MapTo("name")]
public string Name { get; set; }
[MapTo("address")]
public Address? Address { get; set; } // embed a single address
}
public partial class Business : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("_partition")]
public string Partition { get; set; }
[MapTo("name")]
public string Name { get; set; }
[MapTo("addresses")]
public IList<Address> Addresses { get; }
}

내장된 객체는 상위 유형의 스키마에서 내장된 문서에 매핑됩니다. 이 동작은 자체 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" }
}
}
}
}
}

내장된 객체를 생성하려면 내장된 객체의 인스턴스를 상위 객체의 속성에 할당합니다.

var address = new Address() // Create an Address
{
Street = "123 Fake St.",
City = "Springfield",
Country = "USA",
PostalCode = "90710"
};
var contact = new Contact() // Create a Contact
{
Name = "Nick Riviera",
Address = address // Embed the Address Object
};
realm.Write(() =>
{
realm.Add(contact);
});

내장된 객체의 속성을 업데이트하려면 쓰기 트랜잭션(write transaction)에서 속성을 수정합니다.

var resultContact = realm.All<Contact>() // Find the First Contact (Sorted By Name)
.OrderBy(c => c.Name)
.FirstOrDefault();
// Update the Result Contact's Embedded Address Object's Properties
realm.Write(() =>
{
resultContact.Address.Street = "Hollywood Upstairs Medical College";
resultContact.Address.City = "Los Angeles";
resultContact.Address.PostalCode = "90210";
});

내장된 객체를 덮어쓰려면 쓰기 트랜잭션(write transaction)에서 대상의 내장된 객체 속성을 새 인스턴스에 재할당합니다.

var oldContact = realm.All<Contact>() // Find the first contact
.OrderBy(c => c.Name)
.FirstOrDefault();
var newAddress = new Address() // Create an Address
{
Street = "100 Main Street",
City = "Los Angeles",
Country = "USA",
PostalCode = "90210"
};
realm.Write(() =>
{
oldContact.Address = newAddress;
});

점 표기법을 사용하여 내장된 객체 속성 값을 기준으로 객체 컬렉션을 필터링하거나 정렬할 수 있습니다.

참고

내장된 객체를 직접 쿼리할 수는 없습니다. 대신 상위 객체 유형에 대한 쿼리를 통해 내장된 객체에 액세스하세요.

// Find All Contacts with an Address of "Los Angeles"
var losAngelesContacts = realm.All<Contact>()
.Filter("address.city == 'Los Angeles'");
foreach (var contact in losAngelesContacts)
{
Console.WriteLine("Los Angeles Contact:");
Console.WriteLine(contact.Name);
Console.WriteLine(contact.Address.Street);
}

돌아가기

지리 공간 데이터

이 페이지의 내용