Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Melaksanakan BSON Marshaling Tersuai dalam Go?

Bagaimana untuk Melaksanakan BSON Marshaling Tersuai dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-28 03:02:14316semak imbas

How to Implement Custom BSON Marshaling in Go?

Marshaling BSON Tersuai

Marshaling BSON tersuai adalah serupa dengan marshaling JSON tersuai, tetapi anda perlu melaksanakan bson.Getter dan bson .Setter antara muka sebaliknya. Antara muka ini membolehkan anda mentakrifkan cara jenis tersuai anda harus ditukar kepada dan daripada data BSON.

Sebagai contoh, katakan anda mempunyai jenis Mata Wang yang memerlukan marshaling tersuai:

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
}

Dengan pelaksanaan ini, anda kini boleh mendaftarkan jenis Mata Wang tersuai anda dengan MGO BSON pengekod:

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

Kini, apabila anda menyimpan dokumen dengan medan Mata Wang ke MongoDB, pengekod MGO secara automatik akan menggunakan fungsi marshaling tersuai anda untuk menukar Mata Wang kepada BSON.

Perhatikan bahawa ini hanyalah satu contoh bagaimana anda boleh menambah marshaling tersuai untuk jenis BSON. Pelaksanaan khusus akan berbeza-beza bergantung pada keperluan aplikasi tertentu anda.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan BSON Marshaling Tersuai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn