有没有办法直接在mongoDB中存储python对象而不对它们进行序列化

时间:2013-08-06 20:14:57

标签: python mongodb pymongo bson

我已经在某处读过你可以使用BSON将python对象(更具体地说是字典)存储为MongoDB中的二进制文件。但是现在我找不到任何与此相关的文档。

有人知道这是怎么做到的吗?

2 个答案:

答案 0 :(得分:30)

没有办法将对象存储在文件(数据库)中而不进行序列化。如果数据需要从一个进程移动到另一个进程或另一个进程,则需要以某种形式将其序列化以进行传输。由于您询问的是MongoDB,因此数据绝对会以某种形式序列化,以便存储在MongoDB数据库中。使用MongoDB时,它是BSON

如果您实际上询问是否有办法在MongoDB文档中存储更原始形式的Python对象,您可以在文档中插入Binary字段,该文档可以包含任何数据我想。它不能以任何形式直接查询,因此您可能会失去使用像MongoDB这样的NoSQL文档数据库的许多好处。

>>> from pymongo import MongoClient
>>> client = MongoClient('localhost', 27017)
>>> db = client['test-database']
>>> coll = db.test_collection    
>>> # the collection is ready now 
>>> from bson.binary import Binary
>>> import pickle
>>> # create a sample object
>>> myObj = {}
>>> myObj['demo'] = 'Some demo data'
>>> # convert it to the raw bytes
>>> thebytes = pickle.dumps(myObj)
>>> coll.insert({'bin-data': Binary(thebytes)})

答案 1 :(得分:4)

假设您对mongoDB不是特别感兴趣,那么您可能不会寻找BSON。与JSON相比,BSON只是一种不同的序列化格式,旨在提高速度和空间效率。另一方面,pickle更多地直接编码python对象。

但是,在采用pickle之前,请先进行速度测试,以确保它更适合您的使用案例。