Benutzerdefiniertes BSON-Marshalling für komplexe Strukturen
Beim Umgang mit benutzerdefinierten Datenstrukturen, die nicht standardmäßiges Marshalling erfordern, Übergang von JSON zu BSON in MongoDB kann eine Herausforderung sein. Dieser Artikel führt Sie durch die Anpassung des BSON-Marshallings für komplexe Strukturen und bietet eine äquivalente Implementierung zur in der Frage beschriebenen JSON-Marshalling-Methode.
Benutzerdefinierte BSON-Schnittstellen
Benutzerdefiniertes BSON Beim Marshalling werden zwei Schnittstellen implementiert: Getter und Setter. Die Getter-Schnittstelle definiert, wie ein Objekt in BSON dargestellt werden soll, während die Setter-Schnittstelle angibt, wie ein Objekt aus BSON initialisiert werden soll.
Benutzerdefinierte Währungsstruktur
Berücksichtigen Sie die Währungsstruktur aus der ursprünglichen Frage:
type Currency struct { value decimal.Decimal //The actual value of the currency. currencyCode string //The ISO currency code. }
In diesem Szenario möchten Sie den Marshalling-Prozess anpassen, um einen bestimmten BSON auszugeben Darstellung.
Getter und Setter implementieren
Um dies zu erreichen, implementieren Sie die Getter- und Setter-Schnittstellen wie folgt:
// 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 } }
Verwendung :
Nachdem die Getter- und Setter-Implementierungen vorhanden sind, können Sie jetzt ein Marshalling durchführen Währungsstruktur in BSON mithilfe der Marshal-Methode der MGO-Bibliothek. Beispiel: In der Produktstruktur:
type Product struct { Name string Code string Price currency.Currency }
Benutzerdefiniertes BSON-Marshalling wird automatisch angewendet, wenn eine Produktstruktur gemarshallt wird, die ein Währungsfeld enthält.
Das obige ist der detaillierte Inhalt vonWie implementiert man benutzerdefiniertes BSON-Marshalling für komplexe Strukturen in MongoDB?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!