我正在尝试创建一个Golang MongoDB连接器,该连接器接收来自客户端的请求并将请求主体更新/插入到数据库中。请求正文的一个示例是:
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 16-NOV-2018 13:49:13
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Starting /ora01/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /ora01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /ora01/app/oracle/diag/tnslsnr/localhost/agent/alert/log.xml
TNS-01151: Missing listener name, agent, in LISTENER.ORA
Listener failed to start. See the error message(s) above...
[oracle@localhost bin]$
[oracle@localhost bin]$ ./lsnrctl status agent
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 16-NOV-2018 13:50:23
Copyright (c) 1991, 2009, Oracle. All rights reserved.
TNS-01101: Could not find service name agent
[oracle@localhost bin]$
我正在使用的当前Mongo驱动程序和BSON库分别位于github.com/globalsign/mgo/和github.com/globalsign/mgo/bson。
每当我尝试解组上述响应时,都会收到错误消息:
{
"_id": {
"$oid": <hexOID>
},
"DateCreated": {
"$date": 1460091636474
},
"DateModified": {
"$date": 1542241349721
}
}
我已经阅读并看到了有关创建自定义编组器/解组器的一些答案,但是如果解决了这个问题,我将如何去做呢?
我的代码的一个子集如下:
cannot parse date: "{\r\n \"$date\": 1460091636474\r\n }"
我保持更新为接口,因为传递的请求主体不断变化且定义不明确。
答案 0 :(得分:0)
首先,示例中的JSON格式称为MongoDB Extended JSON。这很重要,因为您需要遵循extended JSON date的格式。使用ISO-8601字符串的是$date
,或者使用Unix Epoch的是$date
,并且是$numberLong
。
另一个注意事项是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)