문서 메뉴
문서 홈
/ / /
Rust 드라이버
/

데이터 모델링 및 직렬화

이 페이지의 내용

  • 개요
  • 일반 유형 매개변수
  • 사용자 지정 데이터 모델
  • 사용자 지정 구조체 예제
  • 다중 매개변수화
  • 사용자 지정 직렬화
  • 문자열을 ObjectId로 직렬화
  • DateTime을 문자열로 직렬화
  • u32를 f64로 직렬화
  • 기타 속성 및 모듈
  • 추가 정보
  • API 문서

이 가이드에서는 Rust 드라이버가 BSON과 Rust 유형 간의 변환을 처리하는 방법에 대해 알아볼 수 있습니다. Rust 유형을 BSON으로 변환하는 프로세스를 직렬화 라고 하고, 그 반대의 프로세스를 역직렬화 라고 합니다.

Rust 언어는 정적 유형 시스템을 사용하지만 BSON은 동적 스키마를 사용합니다. Rust 유형과 BSON 간의 변환을 처리하기 위해 드라이버와 bson 라이브러리는 Serde 프레임워크의 기능을 통합합니다. 크레이트를 설치하는 방법을 알아보려면 serde serdecrates.io 참조하세요. 크레이트 레지스트리에서.

serde 크레이트의 기능을 애플리케이션에 구현하면 구조체 및 열거형과 같은 사용자 지정 Rust 유형을 사용하여 데이터를 모델링할 수 있습니다.

이 가이드에는 다음 섹션이 포함되어 있습니다.

  • 일반 유형 매개변수 는 컬렉션 매개변수화 및 데이터 모델링을 설명합니다.

  • 사용자 지정 데이터 모델 은 컬렉션의 데이터를 모델링하기 위해 사용자 지정 Rust 유형을 정의하는 방법을 설명합니다.

  • 사용자 지정 직렬화 는 속성을 사용하여 기본 직렬화 및 역직렬화 동작을 수정하는 방법을 설명하고 예제를 제공합니다.

  • 추가 정보에서 이 가이드에 언급된 유형 및 메소드에 대한 리소스 및 API 문서 링크를 찾을 수 있습니다.

Collection 인스턴스를 만들 때 컬렉션의 문서를 모델링하는 데이터 유형을 나타내는 일반 유형 매개 변수를 지정해야 합니다. 일반 유형 매개변수 지정에 대해 자세히 알아보려면 데이터베이스 및 컬렉션 가이드의 컬렉션 매개변수화 섹션 을 참조하세요.

Document 유형을 사용하는 대신 사용자 지정 유형을 정의하고 사용하여 컬렉션의 데이터를 모델링하는 것이 좋습니다.

크레이트의 및 특성을 구현하는 모든 Rust 데이터 유형을 인스턴스의 일반 Serialize Deserialize serde 유형 매개변수로 사용할 수 Collection 있습니다. SerializeDeserialize 특성을 구현하려면 Rust 유형을 정의하기 전에 다음 derive 속성을 포함해야 합니다:

#[derive(Serialize, Deserialize)]

다음 코드는 serde 직렬화 특성을 구현하는 샘플 Vegetable 구조체를 정의합니다.

#[derive(Serialize, Deserialize)]
struct Vegetable {
name: String,
category: String,
tropical: bool,
}

다음 코드는 일반 유형 매개 변수로 Vegetable 를 사용하여 vegetables collection에 액세스합니다.

let my_coll: Collection<Vegetable> = client
.database("db")
.collection("vegetables");

Collection 인스턴스는 Vegetable 구조체로 매개변수화되어 있으므로 이 유형으로 CRUD 작업을 수행할 수 있습니다. 다음 코드는 Vegetable 인스턴스를 컬렉션에 삽입합니다.

let calabash = Vegetable {
name: "calabash".to_string(),
category: "gourd".to_string(),
tropical: true,
};
my_coll.insert_one(calabash).await?;

collection에 여러 스키마가 포함된 경우 사용자 지정 유형을 정의하여 각 데이터 유형을 모델링하고 각 유형에 대해 원본 Collection 인스턴스의 복제본을 만들 수 있습니다. clone_with_type() 메서드를 사용하여 Collection 인스턴스의 복제본을 만들 수 있습니다.

원래 Square 구조체를 사용하여 collection을 매개변수화했지만 나중에 Circle 구조체에 의해 모델링된 다른 유형의 데이터를 collection에 삽입하고 싶다는 것을 알게 되었다고 가정해 보겠습니다. 다음 코드는 Square 유형으로 collection을 매개변수화한 다음 Circle 유형으로 매개변수화된 collection의 복제본을 만듭니다.

let shapes_coll: Collection<Square> = client
.database("db")
.collection("shapes");
// ... perform some operations with Square
let shapes_coll: Collection<Circle> = shapes_coll.clone_with_type();
// ... perform some operations with Circle

serde 크레이트의 속성 을 사용하여 Rust 드라이버의 기본 직렬화 및 역직렬화 동작을 수정할 수 있습니다. 속성은 구조체의 필드 또는 열거형의 변형에 첨부된 선택적 메타데이터입니다.

serde 크레이트는 헬퍼 함수를 값으로 사용하는 serialize_withdeserialize_with 속성을 제공합니다. 이러한 헬퍼 함수는 특정 필드 및 변형에 대한 직렬화 및 역직렬화를 사용자 지정합니다. 필드에 속성을 지정하려면 필드 정의 앞에 속성을 포함하세요.

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(serialize_with = "<helper function>")]
field1: String,
// ... other fields
}

다음 섹션에서는 bson 라이브러리의 헬퍼 함수를 사용하여 일반적인 직렬화 작업을 수행하는 예제를 찾을 수 있습니다. 이러한 헬퍼 함수의 전체 목록을 보려면 serde_helpers API 설명서를 참조하세요.

문서의 _id 필드를 구조체의 16진수 문자열로 표현할 수 있습니다. 16진수 문자열을 ObjectId BSON types로 변환하려면 serialize_hex_string_as_object_id 헬퍼 함수를 serialize_with 속성 값으로 사용합니다. 다음 예시에서는 serialize_with 속성을 _id 필드에 연결하여 드라이버가 16진수 문자열을 ObjectId 유형으로 직렬화하도록 합니다.

#[derive(Serialize, Deserialize)]
struct Order {
#[serde(serialize_with = "serialize_hex_string_as_object_id")]
_id: String,
item: String,
}

드라이버가 샘플 Order 구조체를 BSON으로 직렬화하는 방법을 확인하려면 다음 StructBSON 탭에서 선택합니다.

let order = Order {
_id: "6348acd2e1a47ca32e79f46f".to_string(),
item: "lima beans".to_string(),
};
{
"_id": { "$oid": "6348acd2e1a47ca32e79f46f" },
"item": "lima beans"
}

문서의 DateTime 필드 값을 BSON에서 ISO 형식의 문자열로 표현할 수 있습니다. 이 변환을 지정하려면 serialize_bson_datetime_as_rfc3339_string 헬퍼 함수를 DateTime 값이 있는 필드에 첨부된 serialize_with 속성의 값으로 사용합니다. 다음 예시에서는 serialize_with 속성을 delivery_date 필드에 연결하여 드라이버가 DateTime 값을 문자열로 직렬화하도록 합니다.

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_bson_datetime_as_rfc3339_string")]
delivery_date: DateTime,
}

드라이버가 샘플 Order 구조체를 BSON으로 직렬화하는 방법을 확인하려면 다음 StructBSON 탭에서 선택합니다.

let order = Order {
item: "lima beans".to_string(),
delivery_date: DateTime::now(),
};
{
"_id": { ... },
"item": "lima beans",
"delivery_date": "2023-09-26T17:30:18.181Z"
}

문서에서 u32 필드 값을 BSON의 f64 또는 Double 유형으로 나타낼 수 있습니다. 이 변환을 지정하려면 serialize_u32_as_f64 헬퍼 함수를 u32 값이 있는 필드에 첨부된 serialize_with 속성의 값으로 사용합니다. 다음 예시에서는 serialize_with 속성을 quantity 필드에 연결하여 드라이버가 u32 값을 Double 유형으로 직렬화하도록 합니다.

#[derive(Serialize, Deserialize)]
struct Order {
item: String,
#[serde(serialize_with = "serialize_u32_as_f64")]
quantity: u32,
}

참고

u32 값의 BSON Double 표현은 원래 값과 동일하게 나타납니다.

헬퍼 함수 외에도 bson 라이브러리는 직렬화와 역직렬화를 모두 처리하는 모듈을 제공합니다. 특정 필드 또는 변형에서 사용할 모듈을 선택하려면 with 속성 값을 모듈 이름으로 설정합니다.

#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(with = "<module>")]
field1: u32,
// ... other fields
}

이러한 모듈의 전체 목록은 serde_helpers API 설명서를 참조하세요.

serde 크레이트는 직렬화를 사용자 지정하기 위한 다른 많은 속성을 제공합니다. 다음 목록에서는 몇 가지 일반적인 속성과 해당 기능을 설명합니다.

  • rename: Rust 구조체 또는 변형 이름 대신 지정된 이름을 사용하여 필드를 직렬화 및 역직렬화합니다.

  • skip: 지정된 필드를 직렬화 또는 역직렬화하지 않습니다.

  • default: 역직렬화 중에 값이 없으면 다음의 기본값을 사용합니다. Default::default()

속성의 전체 목록은 serde serde 속성 API 설명서를 참조하세요.

BSON types 에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 BSON types 를 참조하세요.

serde 기능을 보여주는 더 많은 예제 는 Rust 개발자 센터의 Serde를 사용한 데이터 구조화 문서를 참조하세요.

Serde 프레임워크에 대해 자세히 알아보려면 Serde 설명서를 참조하세요.

이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 문서를 참조하세요.

돌아가기

복합 작업

다음

데이터베이스 및 컬렉션