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