当我定义id uint64`bson:“ _ id”`时,如何自动生成id

时间:2020-06-29 08:36:27

标签: mongodb go

假设您有一个简单的结构

type User struct {
    ID              uint64    `json:"id" bson:"_id"`
    UserName        string    `json:"user_name" bson:"userName"`
    Email           string    `json:"email" bson:"email"`
}

u := User{
    userName: "me",
    Email:    "me@mail.com"
}

我试图像这样将对象插入MongoDB集合中:

r, err := collection.InsertOne(context.TODO(), u)

此处的ID字段的值为0,因为我没有指定值。 问题在于MongoDB不会自动生成_id字段,而是将值设置为等于0,这很合逻辑,但不是我想要的结果。

是否可以使用这种方法自动生成_id

1 个答案:

答案 0 :(得分:0)

您应该在omitempty上使用ID标签。

type User struct {
    ID              primitive.ObjectID    `json:"id" bson:"_id,omitempty"`
    UserName        string    `json:"user_name" bson:"userName"`
    Email           string    `json:"email" bson:"email"`
}

如果未指定omitepmty标记,则行为与Go structs上指定的一样;因此,如果省略任何struct字段,它将为零值。

在这种情况下,因为您已将字段类型指定为primitive.ObjectID,所以ObjectId('000000000000000000000000')是零值。

因此,在创建结构时需要生成一个ID:

collection.InsertOne(context.TODO(), 
                     User{ ID: primitive.NewObjectID(), 
                           UserName: "me", 
                           Email: "me@mail.com"})