Wenn Sie beim Marshallen/Unmarshaling Ihrer Werte von / nach MongoDB einen Wert ändern oder eine Typkonvertierung durchführen möchten, können Sie dies tun, indem Sie eine benutzerdefinierte Marshalling-/Unmarshaling-Logik implementieren.
Sie können dies tun, indem Sie den bson.Getter
implementieren und bson.Setter
Schnittstellen. Innerhalb dieser Methoden können Sie mit den gemarshallten/unmarshallten Werten machen, was Sie wollen.
Am einfachsten ist es, Ihre clientConfigData
zu erweitern type mit einem zusätzlichen Feld, eines vom Typ time.Time
, der benötigte Wert:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Es hat den Tag-Wert bson:"-"
, da wir nicht möchten, dass dies in MongoDB erscheint.
Und jetzt die benutzerdefinierte Marshalling/Unmarhsaling-Logik:
const endDateLayout = "2006-01-02 15:04:05" // Use your layout here
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
}
Was hier passiert, ist das SetBSON()
ist dafür verantwortlich, Ihren Strukturwert mit dem Rohwert aus MongoDB und GetBSON()
zu "füllen". ist dafür verantwortlich, einen Wert bereitzustellen, den Sie speichern (gemarshallt) möchten.
Beim Laden:SetBSON()
entpackt zuerst den Wert so, wie er ist, und legt dann das EndDate
richtig fest Feld (das vom Typ time.Time
ist ) aus der string
Datumswert, der aus der DB kam (EndDateStr
).
Beim Speichern:GetBSON()
füllt zuerst den EndDateStr
Feld (dasjenige, das gespeichert wird) vom EndDate
Feld und kehrt dann einfach zurück und signalisiert, dass es in Ordnung ist zu speichern.
Eine Sache zu beachten:beide SetBSON()
und GetBSON()
Erstellen Sie ein neues my
Geben Sie sie ein. Der Grund dafür ist, einen Stapelüberlauf zu vermeiden. Einfach einen Wert vom Typ clientConfigData
zurückgeben ist schlecht, weil wir bson.Getter
implementiert haben und bson.Setter
, also SetBSON()
und GetBSON()
würde endlos angerufen werden. Das neue my
type hat diese Methoden nicht, also findet keine endlose "Rekursion" statt (der type
-Schlüsselwort erstellt einen neuen Typ und "erbt" keine Methoden des zugrunde liegenden Typs).
Siehe auch verwandte / ähnliche Frage:Standarddatum beim Einfügen von Dokumenten mit Zeit festlegen.Zeitfeld