Si vous souhaitez modifier une valeur ou effectuer une conversion de type lors du marshaling/unmarshaling de vos valeurs de/vers MongoDB, vous pouvez le faire en implémentant une logique de marshaling/unmarshaling personnalisée.
Vous pouvez le faire en implémentant le bson.Getter et bson.Setter interfaces. À l'intérieur de ces méthodes, vous pouvez faire ce que vous voulez avec les valeurs marshalées / non marshalées.
Le plus simple est d'étendre votre clientConfigData tapez avec un champ supplémentaire, celui qui sera de type time.Time , la valeur dont vous avez besoin :
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
Il a la valeur de balise bson:"-" , car nous ne voulons pas que cela apparaisse dans MongoDB.
Et maintenant la logique personnalisée de marshaling/unmarhsaling :
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
}
Ce qui se passe ici est que SetBSON() est responsable de "remplir" votre valeur de structure avec la valeur brute provenant de MongoDB, et GetBSON() est chargé de fournir une valeur que vous souhaitez enregistrer (marshaled).
Lors du chargement :SetBSON() commence par démarshaler la valeur telle quelle, puis définit correctement la EndDate champ (qui est de type time.Time ) à partir de la string valeur de date provenant de la base de données (EndDateStr ).
Lors de l'enregistrement :GetBSON() remplit d'abord le EndDateStr champ (celui qui est enregistré) de la EndDate champ, puis revient simplement, signalant que vous pouvez enregistrer.
Une chose à noter :à la fois SetBSON() et GetBSON() créer un nouveau my tapez à l'intérieur d'eux. La raison en est d'éviter le débordement de pile. Renvoyer simplement une valeur de type clientConfigData est mauvais, car nous avons implémenté bson.Getter et bson.Setter , donc SetBSON() et GetBSON() serait appelé sans fin. Le nouveau my type n'a pas ces méthodes, donc la "récursivité" sans fin ne se produit pas (le type mot-clé crée un nouveau type, et il "n'hérite" pas des méthodes du type sous-jacent).
Voir également la question connexe / similaire :Définir la date par défaut lors de l'insertion d'un document avec le champ heure.Heure