首页 >后端开发 >Golang >如何在 Go 中为 MongoDB 实现自定义 BSON 编组?

如何在 Go 中为 MongoDB 实现自定义 BSON 编组?

Linda Hamilton
Linda Hamilton原创
2024-12-04 11:30:12360浏览

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