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
Linda Hamiltonoriginal
2024-11-28 03:02:14386parcourir

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
}

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")

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!

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