Heim >Backend-Entwicklung >Golang >Wie gehe ich mit eingebetteten Typen und JSON-Marshalling mit MongoDB in Go um?

Wie gehe ich mit eingebetteten Typen und JSON-Marshalling mit MongoDB in Go um?

Susan Sarandon
Susan SarandonOriginal
2024-11-08 19:42:02514Durchsuche

How to Handle Embedded Types and JSON Marshaling with MongoDB in Go?

Eingebettete Typen und JSON-Marshalling in Go mit MongoDB

In MongoDB sind eingebettete Typen eine gängige Methode zur Darstellung hierarchischer Datenstrukturen. Wenn Sie jedoch den JSON-Encoder von Go mit eingebetteten Typen verwenden, ist es wichtig zu berücksichtigen, wie ausgelassene Felder behandelt werden.

Angenommen, Sie haben eine Benutzerstruktur mit einem Secret-Feld, das mit json:"-" annotiert ist, um es vom regulären JSON auszuschließen Antworten. Um das Secret-Feld für Admin-Benutzer zurückzugeben, könnten Sie versucht sein, eine separate adminUser-Struktur mit einem doppelten Secret-Feld zu erstellen. Dieser Ansatz dupliziert jedoch Code und kann zu Wartungsproblemen führen.

Erwägen Sie stattdessen die Verwendung des bson:",inline"-Tags für das Benutzerfeld in adminUser. Dadurch wird der JSON-Encoder angewiesen, die Felder der eingebetteten Struktur einzubinden und sie effektiv zu einem einzigen JSON-Objekt zu kombinieren.

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

Dieser Ansatz kann jedoch beim Lesen aus MongoDB zu doppelten Schlüsselfehlern führen, sowohl als adminUser als auch Der Benutzer enthält das Feld „Geheimnis“. Um dieses Problem zu beheben, entfernen Sie das Feld „Geheimnis“ aus „Benutzer“ und haben Sie es nur in „adminUser“.

type User struct {
    Id   bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
    Name string        `json:"name,omitempty" bson:"name,omitempty"`
}

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

Wenn jetzt ein Benutzer mit einem Admin-Benutzer abgerufen wird, wird das Feld „Geheimnis“ in die JSON-Antwort aufgenommen.

func getUser(w http.ResponseWriter, r *http.Request) {
    ....omitted code...

    var user adminUser
    err := common.GetDB(r).C("users").Find(
        bson.M{"_id": userId},
    ).One(&user)
    if err != nil {
        return
    }
    common.ServeJSON(w, &user)
}

Dieser Ansatz bewahrt die einzige Quelle der Wahrheit für die Benutzerstruktur und ermöglicht es Ihnen, das geheime Feld basierend auf Benutzerberechtigungen dynamisch einzuschließen oder auszuschließen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit eingebetteten Typen und JSON-Marshalling mit MongoDB in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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