从MongoDB驱动程序获取二进制字段

如何从现有的 mongo数据库文档中获取二进制字段?

在MongoDB控制台上,如果我find了一个select的logging,我可以这样做:

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

在我们的web服务器上的python,当我们用pymongo进行查找时,它将该字段视为二进制文件,json_pickle似乎自动将其转换为base64,并且在发送回客户端时图像看上去很好。 当我将生成的base64与node.js mongo驱动程序进行比较时,它是完全不同的,并且不能正确显示图像。

以下是Node.JS的代码:

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

在这里的例子和testing用例: https : //github.com/christkv/node-mongodb-native我没有看到我想要做的任何例子。 似乎有BSON反序列化器和一个用于整个BSON对象的BinaryParser。 我试了一下,发现了一个分割错误。

正在运行我尝试过的东西列表:

  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') 

我对你想要做的事情有点困惑。 在使用node-mongodbselect/插入二进制元素到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以将其选为Buffer; 假返回为“二进制”,但正如手册所说 ,应该避免向缓冲对象。

从缓冲区转换到base64:

 buffer.toString('base64'); 

事实certificate: myDoc.binaryField.value( true ); 前4个字节(32位)是数据大小的大端长度。 如果你从过去的4个字节读取缓冲区,那么最终会成为数据。

在我的情况下,数据的开始看起来像这样在hex:

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

python的数据如下所示:

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)