【问题标题】:Inserting Dates Into Mongo with Golang使用 Golang 将日期插入到 Mongodb
【发布时间】:2018-11-21 14:32:50
【问题描述】:

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

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

【问题讨论】:

    标签: mongodb go bson


    【解决方案1】:

    首先,您的示例中的 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)
    

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 2021-03-12
      • 2014-09-05
      • 2018-12-02
      相关资源
      最近更新 更多