登录
首页 >  Golang >  Go问答

使用 Golang 将日期插入 Mongo

来源:stackoverflow

时间:2024-03-17 08:48:28 127浏览 收藏

在 Golang 中使用 MongoDB 时,通过 globalsign/mgo 包更新或插入日期数据可能会遇到错误。本文探讨了使用该包时遇到的“无法解析日期”错误,并提供了使用 mongo-go-driver/bson 包的替代解决方案。该替代方法利用 UnmarshalExtJSON() 方法解析 MongoDB 扩展 JSON,从而避免了之前的错误,并提供了清晰且有效的日期处理方式。

问题内容

我正在尝试创建一个 golang mongodb 连接器,它接收来自客户端的请求并将请求正文更新/插入到数据库中。请求正文的示例是:

{
        "_id": {
            "$oid": 
        },
        "datecreated": {
            "$date": 1460091636474
        },
        "datemodified": {
            "$date": 1542241349721
        }
    }

我当前使用的 mongo 驱动程序和 bson 库分别位于 github.com/globalsign/mgo/ 和 github.com/globalsign/mgo/bson。

每当我尝试解组上述响应时,都会收到错误:

cannot parse date: "{\r\n        \"$date\": 1460091636474\r\n    }"

我已经阅读并看到了一些关于创建自定义编组器/解组器的答案,但是如果它确实解决了这个问题,我将如何去做呢?

我的代码的子集如下:

var update interface{}
errUpdate := bson.UnmarshalJSON(body, &update)
if errUpdate != nil {
    fmt.Println(errUpdate)
}
dbErr = collection.Update(query, update)

我将更新作为接口,因为传递的请求正文不断变化并且定义不明确。


解决方案


首先,示例中的 json 格式称为 MongoDB Extended JSON。这很重要,因为您需要遵循 extended JSON date 的格式。它可以是带有 iso-8601 字符串的 $date,或者是带有 $ 的 $date numberlong 与 unix epoch。

另一个注意事项是使用 update 时,您需要更新操作,即 $set。如果您打算替换文档,请使用 replace。尽管替换 _id 不太有意义,但下面的示例将使用 replace,如示例中假设的那样。

给出数据库中的示例文档如下:

db.collection.insert({
              "_id": objectid("5bf36072a5820f6e28a4736c"),
              "foo":1
})

使用 globalsign/mgo 的替代方法是使用 mongo-go-driver/bson 包,有一个方法 UnmarshalExtJSON(),您可以轻松地利用它来解析扩展 json。

使用当前版本(0.0.18),示例如下:

import (
    "github.com/mongodb/mongo-go-driver/bson"
    "github.com/mongodb/mongo-go-driver/mongo"
)

replacement := bson.D{}
// Example of response body
data := `{"_id":{"$oid":"5bf36072a5820f6e28a4736c"},"DateModified":{"$date":{"$numberLong":"1542241349721"}},"DateCreated":{"$date":{"$numberLong":"1460091636474"}}}`

err = bson.UnmarshalExtJSON([]byte(data), true, &replacement)
if err != nil {
    log.Fatal(err)
}
query := bson.D{{"Foo", 1}}
replaceResult, err := c.ReplaceOne(context.Background(), query, replacement)

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>