6

我在集合中插入新项目。为此使用官方 mongo go 驱动程序(https://github.com/mongodb/mongo-go-driver)。

collection.InsertOne(context.Background(), map[string]interface{}{
    "string":   "test",
    "integer":  123,
    "float":    0.123,
    "array":    []string{"t", "e", "s", "t"},
    "objectid": objectid.New(),
    "time":     time.Now(),
})

但结果我遇到了几个属性的问题:time.Time 和 objectid.ObjectID。

  • time.Time 是空的对象
  • objectid.ObjectID - 作为二进制

在此处输入图像描述

我知道它仅处于 alpha 状态,但也许有人知道。我只是做错了,还是尚未按应有的方式实施?

4

2 回答 2

5

如果将 amap作为文档传递给Collection.InsertOne()mongo包将使用 将mongo.TransformDocument()其转换为*bson.Document值,因为大多数操作仅在bson.Documents 上实现。

当前的转换实现既不处理objectid.ObjectID也不处理time.Time类型。它可以并且可能应该,我认为它会,但目前它没有。

如果您希望这些类型在 MongoDB 中以正确的类型结束,您可以*bson.Document自己构造并传递一个,您可以在其中明确指定属性的类型应该是什么。

这是与您的等效插入语句,bson.NewDocument()用于手动创建文档:

res, err := coll.InsertOne(context.Background(), bson.NewDocument(
    bson.EC.String("string", "test"),
    bson.EC.Int64("integer", 123),
    bson.EC.Double("float", 0.123),
    bson.EC.ArrayFromElements("array",
        bson.VC.String("t"), bson.VC.String("e"),
        bson.VC.String("s"), bson.VC.String("t")),
    bson.EC.ObjectID("objectid", objectid.New()),
    bson.EC.DateTime("time", time.Now().UnixNano()/1e6), // Must pass milliseconds
))

它更冗长,但它在我们希望 MongoDB 中的结果文档是明确的。结果文档将如下所示:

{
    "_id" : ObjectId("5ac5f598ca151255c6fc0ffb"),
    "string" : "test",
    "integer" : NumberLong(123),
    "float" : 0.123,
    "array" : [
        "t",
        "e",
        "s",
        "t"
    ],
    "objectid" : ObjectId("5ac5f598ca151255c6fc0ffa"),
    "time" : ISODate("2018-04-05T10:08:24.148Z")
}

一旦驱动程序改进,我假设您的原始版本将按预期工作并生成与此结构相同的文档。

于 2018-04-05T10:08:46.837 回答
1

您需要将时间转换为字符串或 unix 时间戳。 time.Now()是一个类型时间,它是一个结构。

a := time.Now()
fmt.Println(a.Unix()) // Goes into mongodb as a int64
fmt.Println(a.String()) // Goes inot mongodb as a string

1522868253// Unix

2018-04-04 13:57:33.495965 -0500 CDT m=+0.000363419// 细绳

所以你可以这样做

collection.InsertOne(context.Background(), map[string]interface{}{
    "string":   "test",
    "integer":  123,
    "float":    0.123,
    "array":    []string{"t", "e", "s", "t"},
    "objectid": objectid.New(),
    "time":     time.Now().String(),
})
于 2018-04-04T19:00:07.223 回答