我正在使用 MongoDB 使用 Python 尝试紧密保存浮点数组。

我可以 创建和正确存储 *

但是 我无法以可用格式检索数据。

>>> 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()
  • 这就是 PyMongo 欺骗你的地方。 bson.binary.Binary 是运行时修补的 strbytes 实例 ( see source )。这就是为什么你会得到第二个错误:你所说的实际上是 str.decode() ,而不是 BSON.decode() 。因此, gotfield 包含您最初存储的随机浮点数据,但对象本身绑定(bind)了一些不同的方法(例如 repr() )。
  • 关于python - Pymongo BSON 二进制保存和检索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22077720/

    10-14 18:05