Custom BSON Marshalling for Complex Structures
When dealing with custom data structures that require non-default marshalling, transitioning from JSON to BSON in MongoDB can be challenging. This article will guide you through customizing BSON marshalling for complex structures, providing an equivalent implementation to the JSON marshalling method described in the question.
Custom BSON Interfaces
Custom BSON marshalling involves implementing two interfaces: Getter and Setter. The Getter interface defines how an object should be represented in BSON, while the Setter interface specifies how an object should be initialized from BSON.
Custom Currency Structure
Consider the Currency structure from the original question:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. }
In this scenario, you want to customize the marshalling process to output a specific BSON representation.
Implementing Getter and Setter
To achieve this, implement the Getter and Setter interfaces as follows:
// 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 } }
Usage:
With the Getter and Setter implementations in place, you can now marshal a Currency struct to BSON using the mgo library's Marshal method. For example, in the Product structure:
type Product struct { Name string Code string Price currency.Currency }
Custom BSON marshalling will be automatically applied when marshalling a Product struct that contains a Currency field.
The above is the detailed content of How to Implement Custom BSON Marshalling for Complex Structures in MongoDB?. For more information, please follow other related articles on the PHP Chinese website!