首頁 > 後端開發 > Golang > 在 Golang 中儲存到 MongoDB 時如何解決空資料值問題?

在 Golang 中儲存到 MongoDB 時如何解決空資料值問題?

WBOY
發布: 2024-02-09 09:40:09
轉載
580 人瀏覽過

在 Golang 中保存到 MongoDB 时如何解决空数据值问题?

在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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板