Golang + MongoDB embedded Art (Einbindung einer Struktur in eine andere Struktur)
Hypothetisch, ich betreibe eine API und wenn ein Benutzer sendet eine GET-Anfrage auf der Benutzer-Ressource, ich werde zurückkehren relevanten Felder als JSON
type User struct {
Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Secret string `json:"-,omitempty" bson:"secret,omitempty"`
}
Wie Sie sehen können, das Secret-Feld in der User hat json:"-"
. Dies bedeutet, dass in den meisten Betrieb, dass ich nicht gerne zurück. In diesem Fall, eine Antwort wäre
{
"id":1,
"Name": "John"
}
Bereich Geheimnis wird nicht zurückgegeben werden, wie json:"-"
lässt das Feld.
Nun, ich bin openning ein admin nur Strecke, wo ich gerne wieder das secret-Feld. Allerdings würde das bedeuten, dass das duplizieren der Benutzer-Struktur.
Meine aktuelle Lösung sieht wie folgt aus:
type adminUser struct {
Id bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
Name string `json:"name,omitempty" bson:"name,omitempty"`
Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
Gibt es eine Möglichkeit zum einbetten von Benutzer adminUser? Wie eine Art Vererbung:
type adminUser struct {
User
Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
Den oben funktioniert derzeit nicht, da nur das Feld geheime zurückgegeben werden, in diesem Fall.
Hinweis: In der aktuellen code-Basis, gibt es einige Dutzende Felder. Als solche, die Kosten für das duplizieren von code ist hoch.
Den tatsächlichen mongo-Abfrage unter:
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)
}
InformationsquelleAutor samol | 2013-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie einen Blick auf die bson-Paket das inline-flag
(das ist dokumentiert unter bson.Marschall).
Es sollte Ihnen ermöglichen, zu tun, so etwas wie dieses:
Aber jetzt werden Sie feststellen, dass Sie bekommen duplicate-key-Fehler
wenn Sie versuchen, Lesen aus der Datenbank mit dieser Struktur
da beide
adminUser
undUser
enthalten den Schlüsselsecret
.In deinem Fall würde ich entfernen, die
Secret
Feld ausUser
und nur das eine in
adminUser
.Dann, Wann immer Sie schreiben müssen, um die
secret
Feld,stellen Sie sicher, Sie verwenden eine
adminUser
.Aktualisiert meine Antwort. Ich wusste nicht, gab es doppelte Schlüssel beteiligt.
Nur als Anmerkung für das Protokoll, die Verwendung des "inline" - tag funktioniert auch für normale Felder (nicht eingebettet/nicht-anonym).
InformationsquelleAutor Evan Shaw
Andere alternative wäre, deklarieren Sie ein interface.
Stellen Sie sicher, dass Ihr Modell implementiert:
Und nur nennen, je nachdem, welche route genannt wird.
Edit: Der Grund für die Verwendung eines interface, hier ist für Fälle, in denen Sie senden, beliebige Modelle auf den Draht mit einer gemeinsamen Methode.
InformationsquelleAutor bojo