Почему я не могу найти идентификатор, используя библиотеку mgo для golang?

Я использую библиотеку mgo для работы с mongo в golang, и вот мой код:

session.SetMode(mgo.Monotonic, true)
coll := session.DB("aaaw_web").C("cron_emails")
var result Result
fmt.Printf("%v", message.ID)
err = coll.FindId(bson.ObjectId(message.ID)).One(&result)
fmt.Printf("%v", result)
fmt.Println(err)

Я получаю этот вывод:

595f2c1a6edcba0619073263
{ObjectIdHex("") 0   0  0    0 {         0    false 0    } 0 0 0  0 0 0 0}
ObjectIDs must be exactly 12 bytes long (got 24)
not found

Но я проверил, документ существует в монго, но здесь нет результата, есть идеи, что мне не хватает...


person Gaurav Garg    schedule 07.07.2017    source источник
comment
правильно, но идентификатор объекта монго состоит из 24 символов, как мне преобразовать этот 24-символьный идентификатор в 12-символьный идентификатор, я также пробовал bson.ObjectIdHex, но не повезло,   -  person Gaurav Garg    schedule 07.07.2017
comment
ObjectIdHex должен работать, я постоянно им пользуюсь err := db.C("images").FindId(bson.ObjectIdHex(id)).One(&m)   -  person tsdtsdtsd    schedule 07.07.2017


Ответы (1)


Как намекает сообщение об ошибке, идентификатор объекта имеет длину ровно 12 байтов (12 байтов данных). Идентификатор длиной 24 символа, который вы видите напечатанным, представляет собой шестнадцатеричное представление 12 байтов идентификатора (1 байт => 2 шестнадцатеричных цифры).

Используйте функцию bson.ObjectIdHex(), чтобы получить значение bson.ObjectId, если доступно шестнадцатеричное представление.

err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)

Для обратного направления вы можете использовать метод ObjectId.Hex(), подробно в этом ответе: Получить значение ObjectIdHex из запроса mgo

То, что вы сделали в своем коде, представляет собой простое преобразование типов (учитывая, что message.ID относится к типу string), и синтаксис действителен, потому что базовым типом bson.ObjectId является string, так что в основном интерпретируются 24 символа как тип bson.ObjectId, но это недопустимое значение ObjectId, потому что это будет 24 байта, а не 12.

person icza    schedule 07.07.2017