[英]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.