Se desideri modificare un valore o eseguire una conversione di tipo durante il marshalling/unmarshalling dei tuoi valori da/a MongoDB, puoi farlo implementando una logica di marshalling/unmarshalling personalizzata.
Puoi farlo implementando il bson.Getter e bson.Setter interfacce. All'interno di questi metodi, puoi fare tutto ciò che vuoi con i valori sottoposti a marshalling/non marshalling.
La cosa più semplice è estendere i tuoi clientConfigData digitare con un campo aggiuntivo, che sarà di tipo time.Time , il valore che ti serve:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Ha il valore del tag bson:"-" , perché non vogliamo che appaia in MongoDB.
E ora la logica di marshalling/unmarhsaling personalizzata:
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
}
Quello che succede qui è che SetBSON() è responsabile di "popolare" il tuo valore struct con il valore grezzo proveniente da MongoDB e GetBSON() è responsabile di fornire un valore che desideri venga salvato (marshalling).
Durante il caricamento:SetBSON() prima annulla il marshalling del valore così com'è, quindi imposta correttamente EndDate campo (che è di tipo time.Time ) dalla string valore della data proveniente dal database (EndDateStr ).
Durante il salvataggio:GetBSON() prima riempie EndDateStr campo (quello che viene salvato) dal EndDate campo, quindi ritorna semplicemente, segnalando che è possibile salvare.
Una cosa da notare:entrambi SetBSON() e GetBSON() crea un nuovo my digita al loro interno. Il motivo è evitare l'overflow dello stack. Semplicemente restituendo un valore di tipo clientConfigData è negativo, perché abbiamo implementato bson.Getter e bson.Setter , quindi SetBSON() e GetBSON() verrebbe chiamato all'infinito. Il nuovo my type non ha questi metodi, quindi non si verifica una "ricorsività" infinita (il type la parola chiave crea un nuovo tipo e non "eredita" i metodi del tipo sottostante).
Vedi anche domanda correlata/simile:imposta la data predefinita quando inserisci il documento con l'ora. Campo ora