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

WBOY
Release: 2024-02-09 09:40:09
forward
485 people have browsed it

在 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 } }
Copy after login

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"` }
Copy after login

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) }
Copy after login

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"} } ]
Copy after login

Solution

The problem is due to using the json tagjson:"currency"to embedCurrencyin theRatetype caused by type. However, the input JSON provided tojson.Unmarshaldoes not contain the corresponding 'Currency' field. Therefore, all fields in theCurrencytype receive zero values and are then stored in MongoDB. To resolve this issue, you can either eliminate the json tagjson:"currency"during embedding of theCurrencytype (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"` }
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!