繁体   English   中英

使用Golang将日期插入Mongo

[英]Inserting Dates Into Mongo with Golang

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

    {
        "_id": {
            "$oid": <hexOID>
        },
        "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)

因为将不断传递的请求主体更改且定义不明确,所以我将update保留为接口。

首先,示例中的JSON格式称为MongoDB Extended JSON 这很重要,因为您需要遵循扩展JSON date的格式。 这是不是$date与ISO-8601字符串或$date$numberLong与Unix的时代。

另一个注意事项是使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM