Heim > Backend-Entwicklung > Golang > Wie gehe ich mit Typunterschieden um, wenn ich von Go aus auf MongoDB zugreife?

Wie gehe ich mit Typunterschieden um, wenn ich von Go aus auf MongoDB zugreife?

Linda Hamilton
Freigeben: 2024-11-19 11:43:03
Original
618 Leute haben es durchsucht

How to Handle Type Discrepancies When Accessing MongoDB from Go?

Zugriff auf MongoDB von Go aus: Benutzerdefiniertes Daten-Marshalling und Unmarshalling

Beim Zugriff auf MongoDB mit Go können Sie auf Szenarien stoßen, in denen die im Der Typ der Datenbank unterscheidet sich von dem, den Sie in Ihren Go-Strukturen definiert haben. Beispielsweise kann Ihr MongoDB-Datumsfeld als Zeichenfolge gespeichert werden, während Ihre Go-Struktur einen time.Time-Wert erwartet.

Um dieses Problem zu beheben, bietet Go die Möglichkeit, benutzerdefinierte Daten-Marshalling- und Unmarshalling-Logik zu implementieren. Durch Anpassen dieser Logik können Sie Typkonvertierungen durchführen oder während des Datenaustauschs zwischen MongoDB und Ihren Go-Strukturen spezifische Formatierungen anwenden.

Eine Möglichkeit, benutzerdefinierte Logik zu implementieren, besteht darin, eigene Typen zu definieren, die bson.Getter und bson implementieren .Setter-Schnittstellen. Mit diesen Schnittstellen können Sie den Marshalling- und Unmarshalling-Prozess steuern. Beispielsweise können Sie Ihren clientConfigData-Typ um ein zusätzliches Feld vom Typ time.Time mit dem Namen EndDate:

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}
Nach dem Login kopieren

erweitern. Das bson:"-"-Tag gibt an, dass das EndDate-Feld nicht in MongoDB beibehalten werden soll.

Als nächstes implementieren Sie die Methoden GetBSON und SetBSON, um benutzerdefiniertes Marshalling und Unmarshalling zu handhaben:

func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
    type my clientConfigData
    if err = raw.Unmarshal((*my)(c)); err != nil {
        return
    }
    c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
    return
}

func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}
Nach dem Login kopieren

In SetBSON() werden die Rohdaten in den benutzerdefinierten Typ my entmarshallt. Anschließend wird das EndDateStr-Feld in einen time.Time-Wert geparst und EndDate zugewiesen.

In GetBSON() wird das EndDateStr-Feld von EndDate aufgefüllt und dann der benutzerdefinierte Typ my zurückgegeben. Dies zeigt an, dass die Daten bereit sind, in MongoDB gemarshallt und gespeichert zu werden.

Durch die Implementierung dieser benutzerdefinierten Marshalling- und Unmarshalling-Logik können Sie die Typdiskrepanz zwischen MongoDB und Ihren Go-Strukturen überbrücken und so Daten nahtlos dazwischen manipulieren die beiden Plattformen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Typunterschieden um, wenn ich von Go aus auf MongoDB zugreife?. 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