Maison > développement back-end > Golang > Comment implémenter le marshaling BSON personnalisé dans Go ?

Comment implémenter le marshaling BSON personnalisé dans Go ?

Linda Hamilton
Libérer: 2024-11-28 03:02:14
original
355 Les gens l'ont consulté

How to Implement Custom BSON Marshaling in Go?

Marshaling BSON personnalisé

Le marshaling BSON personnalisé est similaire au marshaling JSON personnalisé, mais vous devrez implémenter bson.Getter et bson Interfaces .Setter à la place. Ces interfaces vous permettent de définir comment votre type personnalisé doit être converti vers et depuis les données BSON.

Par exemple, disons que vous disposez d'un type de devise qui nécessite un marshaling personnalisé :

package yourpackage

import (
    "context"
    "errors"

    "github.com/globalsign/mgo/bson"
    "github.com/shopspring/decimal"
)

type Currency struct {
    Value        decimal.Decimal
    CurrencyCode string
}

func (c Currency) GetBSON() (interface{}, error) {
    if c.CurrencyCode == "" {
        return nil, errors.New("CurrencyCode cannot be empty")
    }

    return bson.M{
        "value":        c.Value.String(),
        "currencyCode": c.CurrencyCode,
    }, nil
}

func (c *Currency) SetBSON(raw bson.Raw) error {
    var m bson.M

    if err := raw.Unmarshal(&m); err != nil {
        return err
    }

    val, ok := m["value"]
    if !ok {
        return errors.New("missing 'value' field in BSON data")
    }

    c.Value, _ = decimal.NewFromString(val.(string))

    code, ok := m["currencyCode"]
    if !ok {
        return errors.New("missing 'currencyCode' field in BSON data")
    }

    c.CurrencyCode, _ = code.(string)

    return nil
}
Copier après la connexion

Avec cette implémentation, vous pouvez désormais enregistrer votre type de devise personnalisé avec l'encodeur MGO BSON :

session := mgo.Dial("mongodb://localhost:27017")
defer session.Close()

session.SetCollectionValidator("products",{
    "validator":{
        "$jsonSchema":{
            "bsonType":"object",
            "required":["name","code","price"],
            "properties":{
                "name":{"bsonType":"string"},
                "code":{"bsonType":"string"},
                "price":{
                    "bsonType":"object",
                    "required":["value", "currencyCode"],
                    "properties":{
                        "value":{"bsonType":"string", "pattern":"^[0-9,]+(.[0-9,]+)?$"},
                        "currencyCode":{"bsonType":"string", "enum":["USD", "EUR", "GBP"]},
                    },
                },
            }
        }
    }
})

collection := session.DB("products").C("products")
Copier après la connexion

Maintenant, lorsque vous enregistrez un document avec un champ Devise dans MongoDB, l'encodeur MGO utilisera automatiquement votre fonction de marshaling personnalisée pour convertir la devise en BSON.

Notez qu'il ne s'agit que d'un exemple de la façon dont vous pouvez ajouter un marshaling personnalisé pour les types BSON. La mise en œuvre spécifique variera en fonction des exigences de votre application particulière.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal