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 } }
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 } }
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!