假设您有一个简单的结构
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
?
答案 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"})