首页 >后端开发 >Golang >如何在 MongoDB 中实现复杂结构的自定义 BSON 编组?

如何在 MongoDB 中实现复杂结构的自定义 BSON 编组?

Susan Sarandon
Susan Sarandon原创
2024-12-03 07:07:10601浏览

How to Implement Custom BSON Marshalling for Complex Structures in MongoDB?

复杂结构的自定义 BSON 编组

处理需要非默认编组的自定义数据结构时,在 MongoDB 中从 JSON 转换为 BSON可能具有挑战性。本文将指导您为复杂结构自定义 BSON 编组,提供问题中描述的 JSON 编组方法的等效实现。

自定义 BSON 接口

自定义 BSON编组涉及实现两个接口:Getter 和 Setter。 Getter 接口定义了如何在 BSON 中表示对象,而 Setter 接口指定如何从 BSON 初始化对象。

自定义货币结构

考虑原始问题的货币结构:

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

在这种情况下,您想要自定义编组过程以输出特定的 BSON 表示。

实现 Getter 和 Setter

要实现此目的,请实现 Getter 和 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
    }
}

用法:

与 Getter 和 Setter 一起使用实现到位后,您现在可以使用 mgo 库的 Marshal 方法将Currency 结构封送为 BSON。例如,在 Product 结构中:

type Product struct {
    Name  string
    Code  string
    Price currency.Currency
}

编组包含货币字段的 Product 结构时,将自动应用自定义 BSON 编组。

以上是如何在 MongoDB 中实现复杂结构的自定义 BSON 编组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn