Maison  >  Article  >  développement back-end  >  Comment implémenter un marshalling et un démarshalling personnalisés pour accéder aux données MongoDB au fur et à mesure du temps de déplacement ?

Comment implémenter un marshalling et un démarshalling personnalisés pour accéder aux données MongoDB au fur et à mesure du temps de déplacement ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-27 16:31:10949parcourir

How to Implement Custom Marshalling and Unmarshalling to Access MongoDB Data as Go Time in Go?

Accès à MongoDB depuis Go : utilisation de types de données personnalisés

Lors de l'interaction avec MongoDB à l'aide de Go, vous pouvez rencontrer des situations dans lesquelles vous devez modifier ou convertir des valeurs de données lors du marshalling. et sans rassemblement. Cela peut se produire lorsque les données sont stockées dans un format spécifique dans MongoDB mais nécessitent un format différent dans votre structure Go.

Prenons un exemple où EndDate est stocké sous forme de chaîne dans MongoDB, mais vous souhaitez y accéder en tant que a Go Time dans votre structure clientConfigData.

type clientConfigData struct {
    SMTPAssoc      int       `bson:"smtp_assoc"`
    PlanType       string    `bson:"plan_type"`
    EndDate        string    `bson:"end_date"`
}

Pour implémenter un marshalling et un unmarshalling personnalisés, définissez un bson.Getter et Interface bson.Setter.

import (
    "context"
    "time"

    "github.com/mongodb/mongo-go-driver/bson"
)

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

const endDateLayout = "2006-01-02 15:04:05"

// bson.Setter implementation
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
}

// bson.Getter implementation
func (c *clientConfigData) GetBSON() (interface{}, error) {
    c.EndDateStr = c.EndDate.Format(endDateLayout)
    type my *clientConfigData
    return my(c), nil
}

// Custom code to query MongoDB
func FindConfig(ctx context.Context, client *mongo.Client) (*clientConfigData, error) {
    var configRes *clientConfigData
    err := client.Database("test").Collection("clientconfig").FindOne(ctx, bson.M{}).Decode(&configRes)
    if err != nil {
        return nil, errors.Wrap(err, "finding config collection")
    }
    return configRes, nil
}

Dans la méthode SetBSON, nous démontons d'abord la valeur brute, puis analysons le champ EndDateStr pour remplir le champ EndDate. Dans la méthode GetBSON, nous formatons le champ EndDate en chaîne avant de le renvoyer.

En utilisant cette logique personnalisée, vous pouvez désormais accéder à EndDate en tant que Go Time depuis MongoDB.

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