複雑な構造のカスタム BSON マーシャリング
デフォルト以外のマーシャリングを必要とするカスタム データ構造を扱う場合、MongoDB で JSON から BSON に移行する挑戦的になる可能性があります。この記事では、複雑な構造の BSON マーシャリングをカスタマイズする方法を説明し、質問で説明されている JSON マーシャリング メソッドと同等の実装を提供します。
カスタム BSON インターフェイス
カスタム BSONマーシャリングには、Getter と Setter という 2 つのインターフェイスの実装が含まれます。 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 メソッドを使用して Currency 構造体を BSON にマーシャリングできるようになります。たとえば、Product 構造の場合:
type Product struct { Name string Code string Price currency.Currency }
Currency フィールドを含む Product 構造をマーシャリングするときに、カスタム BSON マーシャリングが自動的に適用されます。
以上がMongoDB で複雑な構造のカスタム BSON マーシャリングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。