Maison  >  Article  >  développement back-end  >  Comment gérer les différences de type lors de l'accès à MongoDB depuis Go ?

Comment gérer les différences de type lors de l'accès à MongoDB depuis Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-19 11:43:03568parcourir

How to Handle Type Discrepancies When Accessing MongoDB from Go?

Accès à MongoDB depuis Go : regroupement et démarshalling de données personnalisés

En accédant à MongoDB avec Go, vous pouvez rencontrer des scénarios dans lesquels les données stockées dans le la base de données diffère en type de ce que vous avez défini dans vos structures Go. Par exemple, votre champ de date MongoDB peut être stocké sous forme de chaîne, tandis que votre structure Go attend une valeur time.Time.

Pour résoudre ce problème, Go offre la possibilité d'implémenter une logique personnalisée de marshalling et de démarshalling des données. En personnalisant cette logique, vous pouvez effectuer des conversions de types ou appliquer un formatage spécifique lors de l'échange de données entre MongoDB et vos structures Go.

Une façon d'implémenter une logique personnalisée consiste à définir vos propres types qui implémentent bson.Getter et bson. Interfaces .Setter. Ces interfaces vous permettent de contrôler le processus de marshalling et de démarshalling. Par exemple, vous pouvez étendre votre type clientConfigData avec un champ supplémentaire de type time.Time nommé EndDate:

type clientConfigData struct {
    SMTPAssoc  int       `bson:"smtp_assoc"`
    PlanType   string    `bson:"plan_type"`
    EndDateStr string    `bson:"end_date"`
    EndDate    time.Time `bson:"-"`
}

La balise bson:"-" indique que le champ EndDate ne doit pas être conservé dans MongoDB.

Ensuite, implémentez les méthodes GetBSON et SetBSON pour gérer le marshalling et le démarshalling personnalisés :

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
}

Dans SetBSON(), les données brutes sont désorganisées dans le type personnalisé my. Par la suite, le champ EndDateStr est analysé en une valeur time.Time et attribué à EndDate.

Dans GetBSON(), le champ EndDateStr est renseigné à partir de EndDate, puis le type personnalisé my est renvoyé. Cela indique que les données sont prêtes à être marshallées et conservées dans MongoDB.

En implémentant cette logique de marshalling et de démarshalling personnalisée, vous pouvez combler l'écart de type entre MongoDB et vos structures Go, vous permettant ainsi de manipuler de manière transparente les données entre les deux plateformes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn