Dans Golang, lors de l'enregistrement de données sur MongoDB, vous rencontrez souvent le problème des valeurs de données nulles. Lorsque la valeur d'un champ est vide, MongoDB la stocke comme null par défaut. Cependant, dans les applications réelles, nous préférerons peut-être la stocker comme valeur par défaut spécifique pour un meilleur traitement et une meilleure interrogation des données. Alors, comment résoudre ce problème à Golang ? Cet article recevra une réponse détaillée de l'éditeur php Baicao.
Je suis nouveau sur Golang et j'ai un problème pour enregistrer les données dans la base de données. Après avoir reçu l'objet JSON de l'API, j'ai essayé de le stocker dans MongoDB mais les données ont été enregistrées avec des valeurs nulles.
Voici mon code et ma structure :
var current:={ "usd": { "code": "USD", "alphaCode": "USD", "numericCode": "840", "name": "U.S. Dollar", "rate": 0.68135437808647, "date": "Sun, 31 Dec 2023 11:55:01 GMT", "inverseRate": 1.4676650391657 }, "eur": { "code": "EUR", "alphaCode": "EUR", "numericCode": "978", "name": "Euro", "rate": 0.61624276207684, "date": "Sun, 31 Dec 2023 11:55:01 GMT", "inverseRate": 1.6227371119619 }, "gbp": { "code": "GBP", "alphaCode": "GBP", "numericCode": "826", "name": "U.K. Pound Sterling", "rate": 0.53541690218052, "date": "Sun, 31 Dec 2023 11:55:01 GMT", "inverseRate": 1.8677034586085 } }
C'est mon modèle.go
type Currency struct { Code string `json:"code"` AlphaCode string `json:"alphaCode"` NumericCode string `json:"numericCode"` Name string `json:"name"` Rate float64 `json:"rate"` Date string `json:"date"` InverseRate float64 `json:"inverseRate"` } type Rate struct { ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` Currency `json:"currency"` Timestamp primitive.DateTime `json:"timestamp"` }
J'ai essayé de sauvegarder les données dans la base de données mais j'écris uniquement la valeur par défaut avec une chaîne vide et 0
const apiUrl = "https://www.floatrates.com/daily/aud.json" func GetRatesFromAPI() (map[string]models.Rate, error) { response, err := http.Get(apiUrl) fmt.Print(response) if err != nil { return nil, err } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { return nil, err } var data map[string]models.Rate if err := json.Unmarshal(body, &data); err != nil { return nil, err } fmt.Print(data) return data, nil } r.GET("/get", func(c *gin.Context) { mongo.ConnectDB() rates, err := src.GetRatesFromAPI() fmt.Print(rates) if err != nil { log.Fatal(err) } for _, rate := range rates { mongo.InsertRate(rate) } c.String(http.StatusOK, "get rates") }) func InsertRate(rate models.Rate) { rate.Timestamp = primitive.NewDateTimeFromTime(time.Now()) collection := client.Database("mongodb").Collection("rates") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() result, err := collection.InsertOne(ctx, rate) if err != nil { log.Fatal(err) } log.Println("Inserted rate with ID:", result.InsertedID) }
Je récupère cet objet dans la base de données mais sans aucune valeur et j'essaie de savoir pourquoi les données ne sont pas stockées correctement dans MongoDB. Toute aide ou conseil serait grandement apprécié !
[ { "_id": {"$oid": "659177abefa699e213158c16"}, "currency": { "code": "", "alphacode": "", "numericcode": "", "name": "", "rate": 0, "date": "", "inverserate": 0 }, "timestamp": {"$date": "2023-12-31T14:16:11.800Z"} } ]
Le problème est dû à l'utilisation de la balise json json:"currency"
在 Rate
类型中嵌入 Currency
类型而引起的。但是,为 json.Unmarshal
提供的输入 JSON 不包含相应的“Currency
”字段。因此,Currency
类型中的所有字段都会接收零值,然后将其存储在 MongoDB 中。为了解决这个问题,您可以在嵌入 Currency
类型期间消除 json 标签 json:"currency"
(illustré ci-dessous) ou à la construction de l'objet cible pour qu'il soit cohérent avec la structure du JSON d'entrée.
type Rate struct { ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` Currency Timestamp primitive.DateTime `json:"timestamp"` }
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!