在 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中文网其他相关文章!