复杂结构的自定义 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中文网其他相关文章!