ホームページ >バックエンド開発 >Golang >Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?

Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-28 03:02:14317ブラウズ

How to Implement Custom BSON Marshaling in Go?

カスタム BSON マーシャリング

カスタム BSON マーシャリングはカスタム JSON マーシャリングと似ていますが、bson.Getter と bson を実装する必要があります。代わりに .Setter インターフェイスを使用します。これらのインターフェイスを使用すると、カスタム型と BSON データ間の変換方法を定義できます。

たとえば、カスタム マーシャリングが必要な通貨型があるとします。

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
}

Withこの実装により、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")

今、 Currency フィールドを含むドキュメントを MongoDB に保存すると、MGO エンコーダーは自動的にカスタム マーシャリング関数を使用して通貨を BSON に変換します。

これは、BSON のカスタム マーシャリングを追加する方法の一例にすぎないことに注意してください。種類。具体的な実装は、特定のアプリケーションの要件によって異なります。

以上がGo でカスタム BSON マーシャリングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。