Это старая ошибка E11000, но с изюминкой (и да, я искал и нашел многие из того же вопроса, но без точных деталей, которые здесь применяются - в основном явное назначение _id
).
I 'm вручную присваивая поле _id
с помощью bson.NewObjectId()
, потому что мне нужно вернуть идентификатор клиенту - это было основано на обсуждениях в SO и GitHub, например: https://github.com/go-mgo/mgo/issues/453
https://github.com/Southclaws/ScavengeSurviveCore/blob/master/storage/player.go#L28-L32
Поле идентификатора настроено в структуре следующим образом:
ID bson.ObjectId `json:"_id" bson:"_id"`
https://github.com/Southclaws/ScavengeSurviveCore/blob/master/types/player.go#L9-L23
Пока я не думаю, что что-то пропустил.Модульные тесты создают 3 экземпляра этого объекта один за другим:
https://github.com/Southclaws/ScavengeSurviveCore/blob/master/server/handler_admin_test.go#L21-L56
Первый создается нормально, ему назначено _id
(проверено с помощью mongo-express)и я даже распечатал идентификатор прямо перед вызовом .Insert
, тот же идентификатор, все в порядке:
CREATING {ObjectIdHex("5b092f4aff3055468e3ce00a") playerID1 (...)
Проблема возникает, когда следующая из трех записей теставставляется - точно такой же код, и журнал печатается:
CREATING {ObjectIdHex("5b092f4aff3055468e3ce00b") playerID2 (...)
, но он возвращает E11000:
E11000 duplicate key error collection: <db>.<collection> index: <collection>_id_1 dup key: { : null }
Из того, что я могу собрать, он думает, что _id
- нольно, учитывая все свидетельства, которые я вижу, он вовсе не равен нулю, поскольку bson.NewObjectId()
присваивается полю _id
непосредственно перед вызовом .Insert
- и объект распечатывается непосредственно перед вставкой иИдентификатор есть.
Что мне здесь не хватает?