복잡한 구조를 위한 사용자 정의 BSON 마샬링
기본이 아닌 마샬링이 필요한 사용자 정의 데이터 구조를 처리할 때 MongoDB에서 JSON에서 BSON으로 전환 어려울 수 있습니다. 이 기사에서는 복잡한 구조에 대한 BSON 마샬링을 사용자 정의하여 질문에 설명된 JSON 마샬링 방법과 동등한 구현을 제공하는 방법을 안내합니다.
사용자 정의 BSON 인터페이스
사용자 정의 BSON 마샬링에는 Getter와 Setter라는 두 가지 인터페이스 구현이 포함됩니다. Getter 인터페이스는 BSON에서 객체를 표현하는 방법을 정의하고, Setter 인터페이스는 BSON에서 객체를 초기화하는 방법을 지정합니다.
사용자 정의 통화 구조
다음을 고려하세요. 원래 질문의 통화 구조:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. }
이 시나리오에서는 마샬링 프로세스를 사용자 정의하여 특정 BSON 표현.
Getter 및 Setter 구현
이를 달성하려면 다음과 같이 Getter 및 Setter 인터페이스를 구현하세요.
// GetBSON implements bson.Getter. func (c Currency) GetBSON() (interface{}, error) { f := c.Value().Float64() return struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: f, CurrencyCode: c.currencyCode, }, nil } // SetBSON implements bson.Setter. func (c *Currency) SetBSON(raw bson.Raw) error { decoded := new(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }) bsonErr := raw.Unmarshal(decoded) if bsonErr == nil { c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil } else { return bsonErr } }
사용법:
Getter 및 Setter 구현이 완료되었으므로 이제 mgo 라이브러리의 Marshal 메서드를 사용하여 통화 구조체를 BSON으로 마샬링할 수 있습니다. 예를 들어 제품 구조에서는
type Product struct { Name string Code string Price currency.Currency }
통화 필드가 포함된 제품 구조를 마샬링할 때 사용자 정의 BSON 마샬링이 자동으로 적용됩니다.
위 내용은 MongoDB의 복잡한 구조에 대한 사용자 정의 BSON 마샬링을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!