Maison >développement back-end >Golang >Comment implémenter un marshalling BSON personnalisé pour les structures complexes dans MongoDB ?
Marshalling BSON personnalisé pour les structures complexes
Lorsque vous traitez des structures de données personnalisées qui nécessitent un marshalling autre que celui par défaut, transition de JSON à BSON dans MongoDB peut être un défi. Cet article vous guidera dans la personnalisation du marshalling BSON pour des structures complexes, en fournissant une implémentation équivalente à la méthode de marshalling JSON décrite dans la question.
Interfaces BSON personnalisées
BSON personnalisé le marshalling implique la mise en œuvre de deux interfaces : Getter et Setter. L'interface Getter définit comment un objet doit être représenté dans BSON, tandis que l'interface Setter spécifie comment un objet doit être initialisé à partir de BSON.
Structure de devise personnalisée
Considérez la Structure monétaire de la question d'origine :
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. }
Dans ce scénario, vous souhaitez personnaliser le processus de marshalling pour générer un BSON spécifique représentation.
Implémentation de Getter et Setter
Pour y parvenir, implémentez les interfaces Getter et Setter comme suit :
// 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 } }
Utilisation :
Avec les implémentations Getter et Setter en place, vous pouvez désormais rassembler une devise struct en BSON en utilisant la méthode Marshal de la bibliothèque mgo. Par exemple, dans la structure Product :
type Product struct { Name string Code string Price currency.Currency }
Le marshalling BSON personnalisé sera automatiquement appliqué lors du marshalling d'une structure Product qui contient un champ Devise.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!