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!