Hvis du vil ændre en værdi eller lave en typekonvertering, når du rangerer/udskiller dine værdier fra / til MongoDB, kan du gøre det ved at implementere en brugerdefineret logik for rangering/unmarshaling.
Du kan gøre dette ved at implementere bson.Getter og bson.Setter grænseflader. Inde i disse metoder kan du gøre, hvad du vil med de værdier, der bliver marshaleret / unmarshaled.
Det nemmeste er at udvide din clientConfigData skriv med et ekstra felt, et der vil være af typen time.Time , den værdi, du har brug for:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Den har tagværdien bson:"-" , fordi vi ikke ønsker, at dette skal vises i MongoDB.
Og nu den brugerdefinerede marshaling / 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
}
Det, der sker her, er at SetBSON() er ansvarlig for at "udfylde" din strukturværdi med den rå værdi, der kommer fra MongoDB og GetBSON() er ansvarlig for at angive en værdi, du ønsker skal gemmes (marshaleret).
Ved indlæsning:SetBSON() ophæver først værdien som den er, og sætter derefter EndDate korrekt felt (som er af typen time.Time ) fra string datoværdi, der kom fra DB'en (EndDateStr ).
Ved lagring:GetBSON() udfylder først EndDateStr felt (det, der er gemt) fra EndDate felt, og returnerer så blot og signalerer, at det er ok at gemme.
En ting at bemærke:både SetBSON() og GetBSON() opret en ny my skriv i dem. Grunden til dette er at undgå stak overløb. Du skal blot returnere en værdi af typen clientConfigData er dårligt, fordi vi implementerede bson.Getter og bson.Setter , så SetBSON() og GetBSON() ville blive ringet op i det uendelige. Den nye my type har ikke disse metoder, så endeløs "rekursion" sker ikke (type søgeord opretter en ny type, og det "arver" ikke metoder af den underliggende type).
Se også relateret/lignende spørgsmål:Indstil standarddato ved indsættelse af dokument med time.Time field