在Golang中,儲存資料到MongoDB時,常常會遇到空資料值的問題。當某個欄位的值為空時,MongoDB預設會將其儲存為null。然而,在實際應用中,我們可能更希望將其儲存為特定的預設值,以便更好地處理和查詢資料。那麼,在Golang中如何解決這個問題呢?本文將由php小編百草為您詳細解答。
我是 Golang 的新手,我遇到了將資料儲存到資料庫的問題。從 API 接收到 JSON 物件後,我嘗試將其儲存在 MongoDB 中,但資料以空值保存。
這是我的程式碼和結構:
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 } }
這是我的 model.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"` }
我嘗試將資料儲存到資料庫,但我只寫入帶有空字串和 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) }
我在資料庫中得到這個對象,但沒有任何值,我試圖找出為什麼資料沒有正確儲存在 MongoDB 中。任何幫助或建議將不勝感激!
[ { "_id": {"$oid": "659177abefa699e213158c16"}, "currency": { "code": "", "alphacode": "", "numericcode": "", "name": "", "rate": 0, "date": "", "inverserate": 0 }, "timestamp": {"$date": "2023-12-31T14:16:11.800Z"} } ]
問題是由於使用json 標籤json:"currency"
在Rate
類型中嵌入Currency
類型而引起的。但是,為 json.Unmarshal
提供的輸入 JSON 不包含對應的「Currency
」欄位。因此,Currency
類型中的所有欄位都會接收零值,然後將其儲存在 MongoDB 中。為了解決這個問題,您可以在嵌入Currency
類型期間消除json 標籤json:"currency"
(如下所示),或者建立目標物件以與輸入JSON 的結構保持一致。
type Rate struct { ID primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"` Currency Timestamp primitive.DateTime `json:"timestamp"` }
以上是在 Golang 中儲存到 MongoDB 時如何解決空資料值問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!