mgo NewObjectId поврежден при вставке

Если я сгенерирую новый идентификатор объекта для документа в mgo:

obId := bson.NewObjectId()

а затем вставьте его, он попадает в монго (смотрит через cli) как

"_id" : "U�`�\u0006@�\rU\u0000\u0000\u0001"

Когда это должно быть

"_id" : ObjectId("559a47643d9827f0d9405420")

То же самое происходит, если я пытаюсь обновить существующий документ, где я генерирую идентификатор с помощью

obId := bson.ObjectIdHex(stringId)

Он по-прежнему сериализуется в поврежденном формате.

Моя структура, которую я пытаюсь вставить, выглядит так:

type MyStruct struct {
    Id            bson.ObjectId `bson:"_id,omitempty" json:"id"`
    ...
}

person byrnedo    schedule 06.07.2015    source источник
comment
Как распечатать его, если он отображается как "_id" : "U��@�\rU`?   -  person icza    schedule 06.07.2015
comment
Я использую команду mongo cli и просто копирую вывод db.mycol.find(). Дело в том, что автоматически сгенерированные идентификаторы отображаются как ObjectId("blah...").   -  person byrnedo    schedule 06.07.2015


Ответы (1)


Представление "U�`�\u0006@�\rU\u0000\u0000\u0001" ясно указывает на то, что ObjectId был отправлен в базу данных как строка, а не как правильно типизированный идентификатор объекта. Каждый такой случай раньше был путем кода на стороне приложения, который по ошибке доставлял строку явно как таковую. Я рекомендую исследовать каждый путь кода, который вставляет объекты в эту коллекцию, и если вы не можете найти ни одного варианта, который отправляет его в виде фактической строки, попробуйте создать воспроизводящий механизм и сообщить об этом вышестоящему драйверу mgo.

Обновление: Согласно вашему комментарию ниже, проблема возникает из-за того, что некоторая часть приложения использует тип ObjectId из пакета, который на самом деле не используется во время связи с базой данных. Это приводит к описанному выше эффекту: тип ObjectId, исходящий из неправильного пакета, является просто обычной строкой, поскольку речь идет о правильном пакете bson.

person Gustavo Niemeyer    schedule 06.07.2015
comment
Надеюсь проблема решена. Я использую библиотеку, которая импортирует mgo через gopkg.in/mgo.v2. Я сам импортировал mgo, а также gopkg.in/v2/mgo. После копирования внешнего кода в проект и импорта их из labix.org/v2/mgo теперь все работает. Таким образом, путаница пути, возможно, вызвала это. - person byrnedo; 06.07.2015
comment
labix.org/v2/mgo очень старый. Вместо этого используйте gopkg.in/mgo.v2. - person Gustavo Niemeyer; 06.07.2015
comment
Спасибо @Gustavo, обновит импорт по этому пути. - person byrnedo; 07.07.2015