Golang Mongo 使用 bson.NewObjectID() 插入带有自生成的 _Id 导致意外模式

Abh*_*oni 2 insert go mongodb

嗨,我根据我的用例使用 mongo 和 golang 我想在插入之前生成一个 _id,因为我正在使用

 bson.NewobjectId()
Run Code Online (Sandbox Code Playgroud)

我的结构有点像这样

type Device struct {
    Id             bson.ObjectId `bson:"_id" json:"_id,omitempty"`
    UserId         string        `bson:"userId" json:"userId"`
    CategorySlug   string        `bson:"categorySlug" json:"categorySlug"`
    CreatedAt      time.Time     `bson:"createdAt" json:"createdAt"`
    ModifiedAt     time.Time     `bson:"modifiedAt" json:"modifiedAt"`
    BrandId        int           `bson:"brandId" json:"brandId"`
    Category       string        `bson:"category" json:"category"`
}
Run Code Online (Sandbox Code Playgroud)

当我使用这个 json 请求时

{
    "userId" : "gKn42jJD8uy8ksQpi",
    "categorySlug" : "television",
    "createdAt" : "2016-08-25T18:47:29.558Z",
    "modifiedAt" : "2016-08-25T18:47:29.558Z",
    "brandId" : 90,
    "category" : "LED TV",
    "dateOfPurchase" : "2016-08-25T18:47:29.558Z"
}
Run Code Online (Sandbox Code Playgroud)

并将其解码为设备类型,然后使用 decode.ID = bson.NewObjectId() 初始化我的 id

但是当我查看我的数据库时,插入的值奇怪地以这种形式出现

{
    "_id" : ObjectId("57bf425a34ce5ee85891b914"),
    "0" : {
        "_id" : ObjectId("57bf425ae03ec2179a000001"),
        "userId" : "gKn42jJD8uy8ksQpi",
        "categorySlug" : "television",
        "createdAt" : ISODate("2016-08-25T18:47:29.558Z"),
        "modifiedAt" : ISODate("2016-08-25T18:47:29.558Z"),
        "brandId" : 90,
        "category" : "LED TV",
        "dateofpurchase" : ISODate("2016-08-25T18:47:29.558Z")
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道发生这种情况的原因,所以我希望我的数据在一个适当的 mongo 文档中。请帮助我知道为什么会发生这种情况并且正在生成新的 _id

Tar*_*han 5

生成 mongodb 的新推荐方法_id是使用primitive.ObjectID. 下面是一个简单的例子


import "go.mongodb.org/mongo-driver/bson/primitive"

type Post struct {
    ID        primitive.ObjectID `bson:"_id"`
    Title     string             `bson:"title"`
    Body      string             `bson:"body"`
    Tags      []string           `bson:"tags"`
    Comments  uint64             `bson:"comments"`
    CreatedAt time.Time          `bson:"created_at"`
    UpdatedAt time.Time          `bson:"updated_at"`
}
Run Code Online (Sandbox Code Playgroud)

要插入新文档,您将使用 primitive.NewObjectID()

_, err := col.InsertOne(ctx, &Post{
    ID:        primitive.NewObjectID(),
    Title:     "post",
    Tags:      []string{"mongodb"},
    Body:      `blog post`,
    CreatedAt: time.Now(),
}) 
Run Code Online (Sandbox Code Playgroud)

这是插入结果

{
    "_id" : ObjectId("5c71f03ccfee587e4212ad90"),
    "title" : "post",
    "body" : "blog post",
    "tags" : [ 
        "mongodb"
    ],
    "comments" : NumberLong(0),
    "created_at" : ISODate("2019-02-24T01:15:40.329Z"),
    "updated_at" : null
}
Run Code Online (Sandbox Code Playgroud)

以上代码摘自这篇文章:https : //vkt.sh/go-mongodb-driver-cookbook/