Heim > Backend-Entwicklung > Golang > Wie implementiert man benutzerdefiniertes BSON-Marshalling in Go für MongoDB?

Wie implementiert man benutzerdefiniertes BSON-Marshalling in Go für MongoDB?

Linda Hamilton
Freigeben: 2024-12-04 11:30:12
Original
328 Leute haben es durchsucht

How to Implement Custom BSON Marshalling in Go for MongoDB?

Umgang mit benutzerdefiniertem BSON-Marshalling in Go

Beim Umgang mit benutzerdefinierten Datenstrukturen im Kontext von MongoDB wird es notwendig, benutzerdefiniertes Marshalling und zu implementieren Unmarshaling-Logik, um die korrekte Darstellung und Verarbeitung von Daten im BSON-Format sicherzustellen. In dieser Hinsicht bietet Go Schnittstellen wie bson.Getter und bson.Setter, die benutzerdefiniertes Marshalling und Unmarshaling bestimmter Datentypen ermöglichen.

Betrachten Sie das folgende Beispiel, in dem eine Währungsstruktur zusammen mit benutzerdefiniertem MarshalJSON und UnmarshalJSON definiert wird Methoden zur Handhabung der JSON-Kodierung und -Dekodierung:

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
    }
}
Nach dem Login kopieren

Um benutzerdefiniertes BSON-Marshalling zu erreichen, kann ein ähnlicher Ansatz verwendet werden durch Implementierung der bson.Getter- und bson.Setter-Schnittstellen in der Währungsstruktur:

// 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
    }
}
Nach dem Login kopieren

Durch die Implementierung dieser Schnittstellen verfügt die Währungsstruktur nun über eine benutzerdefinierte BSON-Marshalling-Logik, die ihre Felder effektiv der gewünschten BSON-Darstellung zuordnet Umgang mit benutzerdefinierten Datentypen im aMongoDB-Kontext.

Das obige ist der detaillierte Inhalt vonWie implementiert man benutzerdefiniertes BSON-Marshalling in Go für MongoDB?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage