Pymongo BSON Binary是否保存和检索? [英] Pymongo BSON Binary save and retrieve?
问题描述
我正在与MongoDB一起使用Python尝试紧密保存浮点数组.
I'm working in Python with MongoDB trying to save an array of floats tightly.
我可以正确创建和存储*
但是我无法以可用格式检索数据.
>>> import random, array, pymongo
>>> from bson.binary import Binary as BsonBinary
>>> con = pymongo.Connection('localhost', 27017)
>>> mm = con['testDatabase']
>>> vals = [random.random() *100 for x in range(1, 5)]
>>> vals
[2.9962593, 64.5582810776, 32.3781311717, 82.0606953423]
>>> varray = array.array('f', vals)
>>> varray
array('f', [2.9962593, 64.5582810776, 32.3781311717, 82.0606953423])
>>> vstring = varray.tostring()
>>> vstring
'\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B'
>>> vbson = BsonBinary(vstring, 5)
>>> vbson
Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)
>>> doc1 = { 'something': 1 , 'else' : vbson}
>>> doc1
{'something': 1, 'else': Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)}
>>> mm.test1.insert(doc1)
ObjectID('530f7af1d809d80d3db1f635')
>>> gotdoc = mm.test1.find_one()
>>> gotdoc
{u'_id': ObjectId('530f7af1d809d80d3db1f635'), u'something': 3, u'else': Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)}
>>> gotfield = gotdoc['else']
>>> gotfield
Binary('\xb7\xc2?@\xd7\x1d\x81B5\x83\x01B\x13\x1f\xa4B', 5)
>>> from bson import BSON
>>> BSON.decode(gotfield)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method decode() must be called with BSON instance as first argument (got Binary instance instead)
>>> gotfield.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 0: ordinal not in range(128)
>>>
一旦我取回Python字符串,就可以取回我的随机浮点数数组.但是如何?
推荐答案
让我们解决以下错误:
-
出现第一个错误仅仅是因为您需要一个实际的BSON对象.请注意,您从未编码任何数据-创建
bson.binary.Binary
对象并不意味着调用BSON.encode()
.
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 invokingBSON.encode()
.
这就是PyMongo欺骗您的地方. bson.binary.Binary
是运行时修补的str
或bytes
实例(请参阅源文件).这就是为什么您会收到第二个错误的原因:您实际上调用的是str.decode()
,而不是BSON.decode()
.因此,gotfield
包含您最初存储的随机浮点数据,但是对象本身绑定了一些不同的方法(例如repr()
).
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, gotfield
contains the random float data you've stored initially, but the object itself has some different methods (e.g. repr()
) bound to it.
这篇关于Pymongo BSON Binary是否保存和检索?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!