2 回答

TA贡献2065条经验 获得超14个赞
我是否使用 omitempty 指令都没关系,结果相同。
omitempty标记ID应该可以工作。例如:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
collection.InsertOne(context.Background(), User{Name:"Foo", Email:"Baz"})
如果您不指定omitepmty标记,那么您观察到的行为只是Go 结构行为;因此,如果省略任何结构字段,它将为零值。在这种情况下,因为您已将字段类型指定为original.ObjectID,ObjectId('000000000000000000000000')所以是零值。
这就是为什么您需要在插入之前先生成一个值的原因,即:
collection.InsertOne(context.Background(),
User{ ID: primitive.NewObjectID(),
Name: "Foo",
Email: "Bar"})
有没有办法让数据库处理 ID?
从技术上讲,如果在发送到服务器之前未提供ObjectId,MongoDB 驱动程序会自动生成它。
您可以尝试在插入时使用bson.M而不是 struct 以省略该_id字段,即
collection.InsertOne(context.Background(),
bson.M{"name":"Foo", "email":"Bar"})
上面的代码片段是使用mongo-go-driver v1.3.x 编写的

TA贡献1817条经验 获得超6个赞
omitemptystruct 标签应该可以工作:
type User struct {
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
Name string `json:"name" bson:"name"`
Email string `json:"email" bson:"email"`
}
该primitive.ObjectID类型实现了bsoncodec.Zeroer接口,因此如果它是空对象 ID(全为 0),则应从文档中省略它,并且驱动程序将为您生成一个新的。你可以试试这个并发布输出吗?
- 2 回答
- 0 关注
- 141 浏览
添加回答
举报