Als u een waarde wilt wijzigen of een typeconversie wilt uitvoeren wanneer u uw waarden van / naar MongoDB rangschikt / unmarsharingt, kunt u dit doen door een aangepaste logica voor marshaling / unmarshaling te implementeren.
U kunt dit doen door de bson.Getter
. te implementeren en bson.Setter
interfaces. Binnen deze methoden kun je doen wat je wilt met de waarden die worden gemarshald / unmarshaled.
Het eenvoudigst is om uw clientConfigData
uit te breiden type met een extra veld, een van het type time.Time
, de waarde die je nodig hebt:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Het heeft de tagwaarde bson:"-"
, omdat we niet willen dat dit in MongoDB verschijnt.
En nu de aangepaste marshaling / unmarhsaling-logica:
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
}
Wat hier gebeurt, is dat SetBSON()
is verantwoordelijk voor het "vullen" van uw struct-waarde met de onbewerkte waarde afkomstig van MongoDB, en GetBSON()
is verantwoordelijk voor het verstrekken van een waarde die u wilt behouden (gerangschikt).
Bij het laden:SetBSON()
unmarshal eerst de waarde zoals hij is en stelt vervolgens de EndDate
correct in veld (van het type time.Time
) uit de string
datumwaarde die uit de DB kwam (EndDateStr
).
Bij opslaan:GetBSON()
vult eerst de EndDateStr
veld (degene die wordt opgeslagen) van de EndDate
veld, en keert dan gewoon terug, om aan te geven dat het ok is om op te slaan.
Een ding om op te merken:beide SetBSON()
en GetBSON()
maak een nieuwe my
. aan typ erin. De reden hiervoor is om stack overflow te voorkomen. Gewoon een waarde teruggeven van het type clientConfigData
is slecht, omdat we bson.Getter
. hebben geïmplementeerd en bson.Setter
, dus SetBSON()
en GetBSON()
eindeloos zou worden gebeld. De nieuwe my
type heeft deze methoden niet, dus eindeloze "recursie" gebeurt niet (het type
trefwoord maakt een nieuw type aan en het "erft" geen methoden van het onderliggende type).
Zie ook verwante/vergelijkbare vraag:Standaarddatum instellen bij het invoegen van document met tijd. Veld Tijd