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

Bagaimana untuk Melaksanakan Pemasaran BSON Tersuai dalam Go untuk MongoDB?

Linda Hamilton
Linda Hamiltonasal
2024-12-04 11:30:12563semak imbas

How to Implement Custom BSON Marshalling in Go for MongoDB?

Mengendalikan Custom BSON Marshalling dalam Go

Apabila berurusan dengan struktur data tersuai dalam konteks MongoDB, ia menjadi perlu untuk melaksanakan marshaling tersuai dan logik unmarshaling untuk memastikan perwakilan dan pengendalian data yang betul dalam format BSON. Dalam hal ini, Go menyediakan antara muka seperti bson.Getter dan bson.Setter, yang membenarkan marshaling tersuai dan unmarshaling jenis data tertentu.

Pertimbangkan contoh berikut, di mana struct Mata Wang ditakrifkan bersama MarshalJSON tersuai dan UnmarshalJSON kaedah untuk mengendalikan pengekodan dan penyahkodan JSON:

type Currency struct {
    value        decimal.Decimal //The actual value of the currency.
    currencyCode string          //The ISO currency code.
}

// MarshalJSON implements json.Marshaller.
func (c Currency) MarshalJSON() ([]byte, error) {
    f, _ := c.Value().Float64()
    return json.Marshal(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.CurrencyCode(),
    })
}

// UnmarshalJSON implements json.Unmarshaller.
func (c *Currency) UnmarshalJSON(b []byte) error {

    decoded := new(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    })

    jsonErr := json.Unmarshal(b, decoded)

    if jsonErr == nil {
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return jsonErr
    }
}

Untuk mencapai marshaling BSON tersuai, pendekatan yang serupa boleh digunakan dengan melaksanakan antara muka bson.Getter dan bson.Setter dalam struct Currency:

// 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
    }
}

Dengan melaksanakan antara muka ini, struct Currency kini mempunyai logik marshaling BSON tersuai yang memetakan medannya kepada BSON yang dikehendaki perwakilan, mengendalikan jenis data tersuai dengan berkesan dalam konteks aMongoDB.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pemasaran BSON Tersuai dalam Go untuk MongoDB?. 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