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