Skip to content Skip to sidebar Skip to footer

Pymongo Bson Binary Save And Retrieve?

I'm working in Python with MongoDB trying to save an array of floats tightly. I can Create and store correctly * but I CANNOT RETRIEVE THE DATA IN A USABLE FORMAT. >>> im

Solution 1:

Let's go through the errors:

  1. The first error appears simply because you need an actual BSON object. Note, that you have never encoded any data - creating bson.binary.Binary object does not mean invoking BSON.encode().

  2. And that is where PyMongo cheats you a bit. The bson.binary.Binary is a runtime-patched str or bytes instance (see source). That is why you get the second error: what you call is actually str.decode(), not BSON.decode(). So, gotfieldcontains the random float data you've stored initially, but the object itself has some different methods (e.g. repr()) bound to it.

Solution 2:

I'm coming~ I just find a way. Hope this may help you somehow.

from cStringIO importStringIO
fromPILimportImage

save image:

content = StringIO(f.read())

c = dict(
    content=bson.binary.Binary(content.getvalue()),
)
# insert dict into my database, sha1 is primary key
image_data[sha1] = c

retrieve image:

f = image_data[sha1]
image = Image.open(StringIO(f['content']))

----EDIT----

If you want to return an image from web servers.Do like this:

f = image_data[sha1]
# f['mime'] is the type of image, for example 'png'.
resp = Response(f['content'], mimetype='image/' + f['mime'])
return resp

Solution 3:

Use array.fromstring for the final decoding stage. I can get to the same spot you're at like so:

>>>from bson import Binary>>>import array>>>gotstring = Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)

And finally:

>>>a = array.array('f')>>>a.fromstring(gotstring)>>>a
array('f', [2.9962594509124756, 64.55828094482422, 32.37813186645508, 82.0606918334961])

Solution 4:

You need to encode the array before storing it, and should not use the array.tostring. Please have a look at the documentation here.

from bson import BSON
bson_string = BSON.encode({"hello": "world"})
>>> bson_string
'\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00'>>> bson_string.decode()
{u'hello': u'world'}

Solution 5:

BSON.decode(gotfield)

it has a TypeError problem,and you should write it like that below

BSON.decode(bson.BSON(gotfield))

Post a Comment for "Pymongo Bson Binary Save And Retrieve?"