Golang + MongoDB eingebetteter Typ (Einbetten einer Struktur in eine andere Struktur)

8

Hypothetisch, ich führe eine API aus und wenn ein Benutzer eine GET-Anfrage für die Benutzerressource abgibt, werde ich relevante Felder als JSON zurückgeben

%Vor%

Wie Sie sehen können, hat das Secret-Feld in User json:"-" . Dies bedeutet, dass ich in den meisten Fällen nicht zurückkehren möchte. In diesem Fall wäre eine Antwort

%Vor%

Das Feldgeheimnis wird nicht zurückgegeben, da json:"-" das Feld auslässt.

Jetzt öffne ich eine Admin-Route, auf der ich das geheime Feld zurückgeben möchte. Das würde jedoch bedeuten, die User-Struktur zu duplizieren.

Meine aktuelle Lösung sieht so aus:

%Vor%

Gibt es eine Möglichkeit, Benutzer in adminUser einzubetten? Ein bisschen wie Vererbung:

%Vor%

Das obige funktioniert derzeit nicht, da in diesem Fall nur das Feldgeheimnis zurückgegeben wird.

Hinweis: In der eigentlichen Codebasis gibt es einige Dutzend Felder. Daher sind die Kosten für das Duplizieren von Code hoch.

Die eigentliche Mongo-Abfrage ist unten:

%Vor%     
samol 09.10.2013, 18:06
quelle

2 Antworten

23

Sie sollten sich das Inline-Flag des bson-Pakets ansehen (Das ist dokumentiert unter bson.Marshal ). Es sollte Ihnen erlauben, so etwas zu tun:

%Vor%

Sie werden jedoch feststellen, dass Sie doppelte Schlüsselfehler erhalten wenn Sie versuchen, mit dieser Struktur aus der Datenbank zu lesen, da sowohl adminUser als auch User den Schlüssel secret enthalten.

In Ihrem Fall würde ich das Secret -Feld von User entfernen und nur die in adminUser haben. Dann, wann immer Sie in das Feld secret schreiben müssen, stelle sicher, dass du adminUser benutzt.

    
Evan Shaw 09.10.2013, 18:35
quelle
1

Eine andere Alternative wäre, eine Schnittstelle zu deklarieren.

%Vor%

Stellen Sie sicher, dass Ihr Modell es implementiert:

%Vor%

Und rufe es nur an, je nachdem welche Route aufgerufen wird.

%Vor%

Bearbeiten: Der Grund für die Verwendung einer Schnittstelle ist hier der Fall, dass Sie beliebige Modelle über die Leitung mit einer gemeinsamen Methode senden können.

    
bojo 18.12.2013 07:08
quelle

Tags und Links