2015-03-15 6 views
1

Я развиваюсь в своем Mac, используя mongo и mgo driver.Golang mgo MongoDB bson.ObjectId non utf-8 error

Все отлично работает на моем Mac. Когда мой друг работает на одной и той же кодовой базе с его оконной машины, мы получаем эти странные не utf-8 bson.ObjectIds.

Вот скриншот из mongolab.com (размещаемая Монго сервер)

enter image description here

Мой код просто использует:

thing.Id = bson.NewObjectId() 
thing.eventId = event.Id 

Кто-нибудь имел этот вопрос? Кто-нибудь знает, как справиться с этой

Edit: Все функции BSON, используемые в этом коде являются:

thing.Id = bson.NewObjectId() 
thing.Id = bson.ObjectIdHex(id) 
idString = thing.Id.Hex() 

Спасибо.

+1

Просьба показать объявления типов для полей _id и eventId. –

+1

Как вы записываете поле 'thing.eventId' в базу данных? Поле 'eventId' игнорируется кодером BSON, потому что поле не экспортируется. –

+0

Вы поняли эту проблему? Я думаю, что у меня такая же проблема, см. Http://stackoverflow.com/questions/31244438/mgo-newobjectid-corrupt-on-insert – byrnedo

ответ

1

Символ замены Юникода на снимке экрана показывает, что приложение обрабатывает идентификаторы объектов как кодированный текст UTF-8. Идентификаторы объектов содержат двоичные данные, а не кодированный текст UTF-8.

Используйте метод Hex для преобразования идентификатора объекта в текст, читаемый человеком.

Используйте ObjectIdHex, чтобы преобразовать представление шестнадцатеричной строки обратно в идентификатор объекта. Будьте осторожны, чтобы защитить вызов ObjectIdHex с помощью IsObjectIdHex.

+0

Возможно, utf-8 не моя проблема. Когда я использую свой mac, приведенный выше снимок будет отображать все читаемые человеком символы. Когда объекты создаются/используются на машине Windows, мы получаем эти странные символы. И это на веб-сайте монголаба. – collinglass

+0

В [документации] (http://docs.mongodb.org/manual/reference/object-id/) видно, что они используют строки Go как просто набор байтов, и поэтому я ожидаю, что «интересный» вывода при попытке распечатать его как есть (например, без форматирования% x или% q). Это совершенно [законно в Go] (http://blog.golang.org/strings) (хотя обычно вы видите '[] byte', используемый для этого, преимущество использования' string' в том, что оно доступно только для чтения). –

+0

Если бы я был им, и я хотел использовать базовый тип строки, я бы создал пользовательскую строку типа типа ObjectIDType (но с лучшим именем), чтобы было ясно, что это не простая строка. –