Se você deseja alterar um valor ou fazer uma conversão de tipo ao realizar o marshaling/unmarshaling de seus valores de / para o MongoDB, você pode fazer isso implementando uma lógica de marshaling/unmarshaling personalizada.
Você pode fazer isso implementando o
bson.Getter
e bson.Setter
interfaces. Dentro desses métodos, você pode fazer o que quiser com os valores sendo empacotados/desempacotados. O mais fácil é estender seu
clientConfigData
digite com um campo adicional, que será do tipo time.Time
, o valor que você precisa:type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Tem o valor da tag
bson:"-"
, porque não queremos que isso apareça no MongoDB. E agora a lógica de marshaling/unmarhsaling personalizada:
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
}
O que acontece aqui é que
SetBSON()
é responsável por "preencher" seu valor struct com o valor bruto vindo do MongoDB e GetBSON()
é responsável por fornecer um valor que você deseja que seja salvo (empacotado). Ao carregar:
SetBSON()
primeiro desempacota o valor como está e, em seguida, define corretamente o EndDate
campo (que é do tipo time.Time
) da string
valor de data que veio do banco de dados (EndDateStr
). Ao salvar:
GetBSON()
primeiro preenche o EndDateStr
campo (o que é salvo) do EndDate
campo e, em seguida, simplesmente retorna, sinalizando que está ok para salvar. Uma coisa a notar:tanto
SetBSON()
e GetBSON()
crie um novo my
digite dentro deles. A razão para isso é evitar o estouro de pilha. Simplesmente retornando um valor do tipo clientConfigData
é ruim, porque implementamos bson.Getter
e bson.Setter
, então SetBSON()
e GetBSON()
seria chamado sem parar. O novo my
type não tem esses métodos, então a "recursão" infinita não acontece (o type
palavra-chave cria um novo tipo e não "herda" métodos do tipo subjacente). Veja também a pergunta relacionada/semelhante:Definir data padrão ao inserir documento com campo time.Time