Получение двоичного поля от драйвера MongoDB - PullRequest
4 голосов
/ 08 ноября 2011

Как мне получить двоичное поле из существующего mongo db документа?

На консоли MongoDB, если я делаю поиск для выбранной записи, я получаю это:

{_id:ObjectId("1234"),"cover_data" : BinData(2,"ozkAAP/Y/+AAEEpGSUYAAQEBAJYAlgAA/+IFpElDQ19QUk9GSUxFAAEBAAAFlGFwcGwCIAAAbW50clJHQiBYWVogB9kAAgAZAAsAGgALYWNzcEFQUEwAAAAAYXBwbAAAAAAAAAAAAAAAAAAAAAAAAPbWAAEAAAA ..... )

В python на нашем веб-сервере, когда мы делаем поиск с помощью pymongo, он получает этоПоле как двоичный файл и json_pickle, кажется, автоматически переключают его в base64, и, увы, изображение выглядит великолепно при отправке обратно клиенту.Когда я сравниваю сгенерированный base64 с драйвером mongo для node.js, он совершенно другой и не отображает изображение должным образом.

Вот код для Node.JS:

cb = function(comp) {
    thumb_buffer = new Buffer(comp.thumbnail_data.value(),'binary');
    comp.thumbnail_data = thumb_buffer.toString('base64');
}

В примерах и тестах здесь: https://github.com/christkv/node-mongodb-native Я не вижу ни одного примера того, что я пытаюсь сделать.Кажется, существуют десериализаторы BSON и BinaryParser, который используется в случае целого объекта BSON.Я попробовал это только для одного поля и получил ошибки сегментации.

Рабочий список вещей, которые я пробовал:

    mongo_compositions.find {_id:{$in:ids}},{},(err,compositions) -> 
            for comp in compositions
                do(comp) =>
                    thumb_buffer = comp.thumbnail_data.value(true)
                    test_buffer = Binary(thumb_buffer)
                    console.log test_buffer
                    console.log test_buffer.toString('base64')
                    #thumb_buffer = BSON.deserialize thumb_buffer
                    #thumb_buffer.write(comp.thumbnail_data.value(true))
                    #comp.thumbnail_data = thumb_buffer.toString('base64')
                    #cover_buffer = new Buffer(comp.cover_data.value(),'binary')
                    #console.log thumb_buffer.toString('base64')
                    #console.log "#{comp.composition_author} - #{comp.thumbnail_data.length}"
                    #comp.cover_data = cover_buffer.toString('base64')

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Я немного запутался в том, что вы пытаетесь сделать. При выборе / вставке двоичных элементов в MongoDB с использованием node-mongodb необходимо использовать двоичный объект bson.

var buffer = new Buffer(); /* your binary data */
var binary = client.bson_serializer.Binary( buffer );
var myDoc = {
    binaryField: binary;
}
//And for when selecting the document
var buffer = myDoc.binaryField.value( true ); 

Установите для аргумента toString значение true, чтобы выбрать его в качестве буфера; false для возврата в виде «двоичного», но, как говорится в руководстве , его следует избегать в отношении объекта буфера.

Чтобы перевести из буфера в base64:

buffer.toString('base64');
2 голосов
/ 09 ноября 2011

Как выясняется для: myDoc.binaryField.value( true ); Первые 4 байта (32 бита) - это длина с прямым порядком байтов для размера данных.Если вы прочитаете из этих 4-х байтов буфер, то в конечном итоге это будут данные.

В моем случае начало данных выглядело так в шестнадцатеричном виде:

63 12 00 00 ff d8 ff e0 00 10 4a 46

Данные питона выглядели так:

ff d8 ff e0 00 10 4a 46

Binary = client.bson_serializer.Binary
binary = new Binary(myDoc.binaryField.value( true ))
buffer = new Buffer(binary.toString(),'binary')
length_buf = buffer.slice(0,4)
length = length_buf[3] << 32 | length_buf[2] << 16 | length_buf[1] << 8 | length_buf[0]
buffer.slice(4).slice(0,length).toString(enc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...