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.
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"} } ]
The problem is due to using the json tagjson:"currency"
to embedCurrency
in theRate
type caused by type. However, the input JSON provided tojson.Unmarshal
does not contain the corresponding 'Currency
' field. Therefore, all fields in theCurrency
type receive zero values and are then stored in MongoDB. To resolve this issue, you can either eliminate the json tagjson:"currency"
during embedding of theCurrency
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!