MongoDb: после вставки UUID с ruby, c # не может преобразовать его в GUID - PullRequest
3 голосов
/ 11 июля 2011

Я пытаюсь вставить объект в mongoDB с помощью ruby ​​и извлечь его с помощью c # и драйвера NoRM.

Все шло хорошо, пока я не захотел использовать Guid в моем объекте c #.

Я использовал следующий код для установки UUID в ruby, прежде чем вставлять его в монго (как предложено в этом блоге http://blog.mikeobrien.net/2010/08/working-with-guids-in-mongodb-with-ruby.html):

BSON::Binary.new("d7b73eed91c549bfaa9ea3973aa97c7b", BSON::Binary::SUBTYPE_UUID)

При извлечении этого объекта в c # возникает исключение «Массив байтов для GUID должен быть ровно 16 байтов». был брошен.

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

BinData(3,"ZDdiNzNlZWQ5MWM1NDliZmFhOWVhMzk3M2FhOTdjN2I=")

Однако, если я вставил тот же Guid с помощью c #, свойство guid было установлено на

BinData(3,"7T6318WRv0mqnqOXOql8ew==")

Есть идеи, что я делаю не так?

1 Ответ

2 голосов
/ 11 июля 2011

Я думаю, что пример блога просто неверен. Мне кажется, что вы хотите, чтобы guid был шестнадцатеричной строкой, то есть начиная с "\ xd7" (один байт), а не "d7"

Я пробовал это:

guidpack=guid.scan(/../).map {|e| e.to_i(16)}.pack('c*')

И проверил закодированный в Base64 размер, он выглядит прямо сейчас.

Base64.encode64 BSON::Binary.new(guidpack, BSON::Binary::SUBTYPE_UUID).to_s
=> "17c+7ZHFSb+qnqOXOql8ew==\n"

Но результат не совсем соответствует тому, что происходит, когда вы используете C # выше, так что это может быть не совсем правильный ответ. (Я не тестирую монго и т. Д., Просто камень bson, поэтому не могу проверить извините)

...