Home  >  Article  >  Backend Development  >  How to resolve null data value issue when saving to MongoDB in Golang?

How to resolve null data value issue when saving to MongoDB in Golang?

WBOY
WBOYforward
2024-02-09 09:40:09528browse

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

In Golang, when saving data to MongoDB, you often encounter the problem of null data values. When the value of a field is empty, MongoDB stores it as null by default. However, in real applications, we may prefer to store it as a specific default value for better processing and querying of the data. So, how to solve this problem in Golang? This article will be answered in detail by php editor Baicao.

Question content

I am new to Golang and I have a problem saving data to database. After receiving the JSON object from the API, I tried to store it in MongoDB but the data was saved with null values.

This is my code and 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
    }
}

This is my 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"`
}

I tried saving the data to the database but I only wrote the default value with an empty string and 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)
}

I am getting this object in the database but without any value and I am trying to find out why the data is not being stored correctly in MongoDB. Any help or advice would be greatly appreciated!

[
  {
    "_id": {"$oid": "659177abefa699e213158c16"},
    "currency": {
      "code": "",
      "alphacode": "",
      "numericcode": "",
      "name": "",
      "rate": 0,
      "date": "",
      "inverserate": 0
    },
    "timestamp": {"$date": "2023-12-31T14:16:11.800Z"}
  }
]

Solution

The problem is due to using the json tag json:"currency" to embed Currency in the Rate type caused by type. However, the input JSON provided to json.Unmarshal does not contain the corresponding 'Currency' field. Therefore, all fields in the Currency type receive zero values ​​and are then stored in MongoDB. To resolve this issue, you can either eliminate the json tag json:"currency" during embedding of the Currency type (as shown below), or build the target object to be consistent with the structure of the input JSON .

type Rate struct {
    ID        primitive.ObjectID `json:"_id,omitempty" bson:"_id,omitempty"`
    Currency 
    Timestamp primitive.DateTime `json:"timestamp"`
}

The above is the detailed content of How to resolve null data value issue when saving to MongoDB in Golang?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete