Неважно, если я использую директиву 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 структурирует поведение; при этом, если какое-либо из полей структуры опущено, оно будет иметь нулевое значение. В этом случае, поскольку вы указали тип поля primitive.ObjectID , ObjectId('000000000000000000000000')
- это нулевое значение.
Это причина, по которой вам нужно сначала сгенерировать значение перед вставкой, то есть:
collection.InsertOne(context.Background(),
User{ ID: primitive.NewObjectID(),
Name: "Foo",
Email: "Bar"})
Есть ли способ заставить БД обрабатывать идентификатор?
Технически, это драйвер MongoDB, который автоматически генерирует ObjectId , если он не передан перед отправкой на сервер.
Вы можете попытаться использовать bson.M вместо структуры при вставке, чтобы пропустить поле _id
, т.е.
collection.InsertOne(context.Background(),
bson.M{"name":"Foo", "email":"Bar"})
Фрагмент кода написан выше используя mon go - go -драйвер v1.3.x