Si desea cambiar un valor o realizar una conversión de tipo al clasificar/desclasificar sus valores de/a MongoDB, puede hacerlo implementando una lógica personalizada de clasificación/desclasificación.
Puede hacer esto implementando el bson.Getter
y bson.Setter
interfaces Dentro de estos métodos, puede hacer lo que quiera con los valores que se calculan o no.
Lo más fácil es extender su clientConfigData
type con un campo adicional, uno que será del tipo time.Time
, el valor que necesita:
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Tiene valor de etiqueta bson:"-"
, porque no queremos que esto aparezca en MongoDB.
Y ahora la lógica personalizada de serialización/desmarhsaling:
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
}
Lo que sucede aquí es que SetBSON()
es responsable de "rellenar" el valor de su estructura con el valor bruto procedente de MongoDB y GetBSON()
es responsable de proporcionar un valor que desea que se guarde (marshaled).
Al cargar:SetBSON()
primero desarma el valor tal como está, luego establece correctamente la EndDate
campo (que es de tipo time.Time
) de la string
valor de fecha que vino de la base de datos (EndDateStr
).
Al guardar:GetBSON()
primero llena el EndDateStr
campo (el que se guarda) del EndDate
y luego simplemente regresa, lo que indica que está bien guardar.
Una cosa a tener en cuenta:ambos SetBSON()
y GetBSON()
crear un nuevo my
escriba dentro de ellos. La razón de esto es evitar el desbordamiento de la pila. Simplemente devolviendo un valor de tipo clientConfigData
es malo, porque implementamos bson.Getter
y bson.Setter
, entonces SetBSON()
y GetBSON()
sería llamado sin cesar. El nuevo my
type no tiene estos métodos, por lo que la "recursión" sin fin no ocurre (el type
palabra clave crea un nuevo tipo y no "hereda" los métodos del tipo subyacente).
Consulte también una pregunta relacionada/similar:Establecer fecha predeterminada al insertar un documento con la hora. Campo de hora