首頁 >後端開發 >Golang >如何在 Go 中為 MongoDB 實作自訂 BSON 編組?

如何在 Go 中為 MongoDB 實作自訂 BSON 編組?

Linda Hamilton
Linda Hamilton原創
2024-12-04 11:30:12624瀏覽

How to Implement Custom BSON Marshalling in Go for MongoDB?

在Go 中處理自訂BSON 編組

在MongoDB 上下文中處理自訂資料結構時,有必要實作自訂編組和解群組邏輯,以確保正確表示和處理BSON 格式的資料。在這方面,Go 提供了像 bson.Getter 和 bson.Setter 這樣的接口,它們允許對特定資料類型進行自訂編組和解組。

考慮以下範例,其中定義了Currency 結構以及自訂MarshalJSON 和UnmarshalJSON處理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
    }
}

要實作自訂BSON 封送處理,可以透過實作來使用類似的方法貨幣結構中的bson.Getter 和bson.Setter接口:

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

透過實作這些接口,貨幣結構現在具有自訂 BSON 編組邏輯,將其欄位對應到所需的 BSON 表示,從而有效地處理自訂MongoDB 上下文中的資料類型。

以上是如何在 Go 中為 MongoDB 實作自訂 BSON 編組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn