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

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

Susan Sarandon
发布: 2024-12-03 07:07:10
原创
600 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板