加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Pymongo BSON二进制保存和检索?

发布时间:2020-12-20 11:33:45 所属栏目:Python 来源:网络整理
导读:我在 Python中使用MongoDB尝试紧紧保存一系列浮点数. 我可以正确创建和存储* 但我无法以可用的格式检索数据. import random,array,pymongo from bson.binary import Binary as BsonBinary con = pymongo.Connection('localhost',27017) mm = con['testDataba
我在 Python中使用MongoDB尝试紧紧保存一系列浮点数.

我可以正确创建和存储*

但我无法以可用的格式检索数据.

>>> 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,82.0606953423])
>>> vstring = varray.tostring()
>>> vstring
'xb7xc2?@xd7x1dx81B5x83x01Bx13x1fxa4B'
>>> vbson = BsonBinary(vstring,5)
>>> vbson
Binary('xb7xc2?@xd7x1dx81B5x83x01Bx13x1fxa4B',5)
>>> doc1 = { 'something': 1,'else' : vbson}
>>> doc1
{'something': 1,'else': Binary('xb7xc2?@xd7x1dx81B5x83x01Bx13x1fxa4B',5)}
>>> mm.test1.insert(doc1)
ObjectID('530f7af1d809d80d3db1f635')
>>> gotdoc = mm.test1.find_one()
>>> gotdoc
{u'_id': ObjectId('530f7af1d809d80d3db1f635'),u'something': 3,u'else': Binary('xb7xc2?@xd7x1dx81B5x83x01Bx13x1fxa4B',5)}
>>> gotfield = gotdoc['else']
>>> gotfield
Binary('xb7xc2?@xd7x1dx81B5x83x01Bx13x1fxa4B',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>",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是运行时修补的str或bytes实例(see source).这就是你得到第二个错误的原因:你所调用的实际上是str.decode(),而不是BSON.decode().因此,gotfield包含您最初存储的随机浮点数据,但对象本身有一些不同的方法(例如repr())绑定到它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读