使用Golang将日期插入Mongo

时间:2018-11-16 18:52:24

标签: mongodb go bson

我正在尝试创建一个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    }"

我保持更新为接口,因为传递的请求主体不断变化且定义不明确。

1 个答案:

答案 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)