複雜結構的自訂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 方法將Currency 結構封送為 BSON。例如,在 Product 結構中:
type Product struct { Name string Code string Price currency.Currency }
編組包含貨幣欄位的 Product 結構時,將自動套用自訂 BSON 編組。
以上是如何在 MongoDB 中實作複雜結構的自訂 BSON 編組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!