Home > Backend Development > Golang > How to Implement Custom BSON Marshalling for Complex Structures in MongoDB?

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

Susan Sarandon
Release: 2024-12-03 07:07:10
Original
543 people have browsed it

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

Custom BSON Marshalling for Complex Structures

When dealing with custom data structures that require non-default marshalling, transitioning from JSON to BSON in MongoDB can be challenging. This article will guide you through customizing BSON marshalling for complex structures, providing an equivalent implementation to the JSON marshalling method described in the question.

Custom BSON Interfaces

Custom BSON marshalling involves implementing two interfaces: Getter and Setter. The Getter interface defines how an object should be represented in BSON, while the Setter interface specifies how an object should be initialized from BSON.

Custom Currency Structure

Consider the Currency structure from the original question:

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

In this scenario, you want to customize the marshalling process to output a specific BSON representation.

Implementing Getter and Setter

To achieve this, implement the Getter and Setter interfaces as follows:

// 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
    }
}
Copy after login

Usage:

With the Getter and Setter implementations in place, you can now marshal a Currency struct to BSON using the mgo library's Marshal method. For example, in the Product structure:

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

Custom BSON marshalling will be automatically applied when marshalling a Product struct that contains a Currency field.

The above is the detailed content of How to Implement Custom BSON Marshalling for Complex Structures in MongoDB?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template