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