我是Golang的新手,我面临着将数据保存到数据库的问题.在从API接收到JSON对象后,我试图将其存储在MongoDB中,但数据被保存为空值.

下面是我的代码和 struct :

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
    }
}

这是我的模特.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"`
}

我try 将数据保存到数据库,但我只写入默认值,其中包含空字符串和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)
}

我在DB中获取这个对象时没有任何值,我试图找出为什么数据没有正确存储在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"Currency类型嵌入到Rate类型中.然而,为json.Unmarshal提供的输入JSON不包含对应的"currency"字段.因此,Currency类型中的所有字段都接收零值,然后将这些值存储在MongoDB中.要解决这个问题,您可以在嵌入Currency类型的过程中删除json标记json:"currency"(如下所示),或者构造目标对象以与输入JSON的 struct 对齐.

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

Mongodb相关问答推荐

MongoDB:如何获取多个$indexOfArray值?

无法配置数据源:未指定url属性,无法为 MongoDb 配置嵌入数据源

MongoDB:如何从数组中的所有对象中删除属性?

Mongo,通过 Lookup 计算多个文档中数组中的项目

尽管前一阶段输出文档,$group stage 仍返回零文档

$lookup 的参数必须是字符串

如何修改 mongodb 中嵌套对象数组中的字段名称/键?

在推入 mongodb 时自动填充 golang struct 中的 created_at 和 updated_at

_id 和 $oid 的区别; mongo 数据库中的 $date 和 IsoDate

Mongo 无法启动

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

MongoDB 2.1 聚合框架总和匹配名称的数组元素

在 Nodejs 中找不到模块

在 GridFS、express、mongoDB、node.js 中存储来自 POST 请求的数据流

插入违反唯一索引的 MongoDB 文档时如何捕获错误?

如何在 Rails 中混合使用 mongodb 和传统数据库?

pre save和validate之间的mongoose区别?什么时候用哪一个?

MongoDB备份计划

brew install mongodb 错误:Cowardly refusing to `sudo brew install' Mac OSX Lion

MongoDB InsertMany 与 BulkWrite