Om du vill ändra ett värde eller göra en typkonvertering när du sorterar / delar upp dina värden från / till MongoDB, kan du göra det genom att implementera en anpassad logik för rangering / unmarshaling.
Du kan göra detta genom att implementera bson.Getter
och bson.Setter
gränssnitt. Inom de här metoderna kan du göra vad du vill med de värden som raderas/avgränsas.
Enklast är att utöka din clientConfigData
skriv med ett extra fält, ett som kommer att vara av typen time.Time
, värdet du behöver:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Den har taggvärdet bson:"-"
, eftersom vi inte vill att detta ska visas i MongoDB.
Och nu den anpassade logiken för marshaling / unmarhsaling:
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 som händer här är att SetBSON()
är ansvarig för att "fylla" ditt strukturvärde med råvärdet som kommer från MongoDB och GetBSON()
är ansvarig för att tillhandahålla ett värde som du vill ska sparas (marshaleras).
Vid laddning:SetBSON()
avmarkerar först värdet som det är och ställer sedan in EndDate
korrekt fältet (som är av typen time.Time
) från string
datumvärde som kom från DB (EndDateStr
).
När du sparar:GetBSON()
först fyller EndDateStr
fältet (det som sparas) från EndDate
fältet och returnerar sedan helt enkelt, vilket signalerar att det är ok att spara.
En sak att notera:båda SetBSON()
och GetBSON()
skapa en ny my
skriv i dem. Anledningen till detta är att undvika stackspill. Returnerar helt enkelt ett värde av typen clientConfigData
är dåligt eftersom vi implementerade bson.Getter
och bson.Setter
, alltså SetBSON()
och GetBSON()
skulle bli uppringd oändligt. Den nya my
typ har inte dessa metoder, så oändlig "rekursion" inträffar inte (type
nyckelordet skapar en ny typ och det "ärver" inte metoder av den underliggande typen).
Se även relaterad / liknande fråga:Ställ in standarddatum när du infogar dokument med time.Time field