在Go 中處理自訂BSON 編組
在MongoDB 上下文中處理自訂資料結構時,有必要實作自訂編組和解群組邏輯,以確保正確表示和處理BSON 格式的資料。在這方面,Go 提供了像 bson.Getter 和 bson.Setter 這樣的接口,它們允許對特定資料類型進行自訂編組和解組。
考慮以下範例,其中定義了Currency 結構以及自訂MarshalJSON 和UnmarshalJSON處理JSON 編碼和解碼的方法:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. } // MarshalJSON implements json.Marshaller. func (c Currency) MarshalJSON() ([]byte, error) { f, _ := c.Value().Float64() return json.Marshal(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: f, CurrencyCode: c.CurrencyCode(), }) } // UnmarshalJSON implements json.Unmarshaller. func (c *Currency) UnmarshalJSON(b []byte) error { decoded := new(struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }) jsonErr := json.Unmarshal(b, decoded) if jsonErr == nil { c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil } else { return jsonErr } }
要實作自訂BSON 封送處理,可以透過實作來使用類似的方法貨幣結構中的bson.Getter 和bson.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 } }
透過實作這些接口,貨幣結構現在具有自訂 BSON 編組邏輯,將其欄位對應到所需的 BSON 表示,從而有效地處理自訂MongoDB 上下文中的資料類型。
以上是如何在 Go 中為 MongoDB 實作自訂 BSON 編組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!