我在某处读过,您可以使用 BSON 将 python 对象(更具体地说是字典)作为二进制文件存储在 MongoDB 中。但是现在我找不到任何与此相关的文档。
有谁知道这到底是怎么做到的?
没有办法将对象存储在文件(数据库)中而不对其进行序列化。如果数据需要从一个进程移动到另一个进程或另一个服务器,则需要以某种形式序列化以进行传输。由于您询问的是 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)})
假设您对 mongoDB 不是特别感兴趣,那么您可能不是在寻找 BSON。与 JSON 相比,BSON 只是一种不同的序列化格式,旨在提高速度和空间效率。另一方面,pickle
对 python 对象进行了更多的直接编码。
但是,请在采用之前进行速度测试,pickle
以确保它更适合您的用例。
看来您仍然需要使用pickle
会创建字节的模块进行序列化,并使用pickle
将直接提供 python 对象的反序列化这些字节。
此外,您可以将pickled
对象直接存储到 Mongo 中。
import pickle as pkl
from uuid import uuid4
from pymongo import MongoClient
data = dict(key='mongo')
picked_data = pkl.dumps(data)
uid = uuid4()
client = MongoClient() # add DB url in the constructor if needed
db = client.test
# insertion
db.data.insert_one({
'uuid': uid,
'data': picked_data
})
# retrieval
result = db.data.find_one({'uuid': uid})
assert pkl.loads(result['data']) == data