Maison >développement back-end >Golang >Comment implémenter un marshalling BSON personnalisé pour les structures complexes dans MongoDB ?

Comment implémenter un marshalling BSON personnalisé pour les structures complexes dans MongoDB ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-03 07:07:10604parcourir

How to Implement Custom BSON Marshalling for Complex Structures in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn