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 關注
- 131 瀏覽
添加回答
舉報