将二进制数据插入pymongo的Mongo字段中

问题描述 投票:5回答:2

[我正在尝试做一些我觉得很琐碎的事情,如果其他地方有一些简单的解决方案,请原谅我。

我正在为一些内容索引编写测试,为此,我试图将一些二进制数据(pdf)插入到我拥有的mongo集合中。但是,我对此有很多麻烦。这是我的相关代码的当前状态

pseudo_file = StringIO()
pdf = pisa.CreatePDF("This is a test", pseudo_file)
test = {"data": pseudo_file}
test.update({"files_id": {"name": "random_asset_name"}, "category": "asset"})
self.chunk_collection.insert(json.dumps(test))

我设法在Pymongo google组上找到了解决此问题的旧线程(https://groups.google.com/forum/#!topic/mongodb-user/uBAbY1wdQbs),但是我似乎找不到用于解决该问题的Binary对象,而且似乎也没有包含在Python中(我使用的是2.7)

现在,我遇到的问题是StringIO对象不是JSON可序列化的,这是明智的,但是pymongo需要将有效的utf8对象传递给它。我尝试使用StringIO.getvalue()的base64编码,并直接直接序列化相同的值。

当然,pdf的值不是utf8,所以我想知道是否还有另一种方法让pymongo识别出我正在将其发送为原始二进制文件。任何帮助表示赞赏。

python mongodb encoding pymongo binaryfiles
2个回答
3
投票

但是,Google组实际上是正确的,在该位置上的某个时间之后,binary类已移至bson名称空间,因此您必须从那里导入它。

文档页面上有很好的例子:http://api.mongodb.org/python/current/api/bson/binary.html


0
投票

这可以通过bson来实现。在酸洗/酸洗对象的示例中,完整的往返行程如下所示:

bson

应注意,尽管import bson # serialization collection.insert_one({ "binary_field": bson.Binary(pickle.dumps(my_object)), }) # deserialization record = collection.find_one({ ... }) pickle.loads(record["binary_field"]) # Note that the Binary type can be passed into pickle.loads directly. 包是顶级包,但它仍是bson的一部分。根据pymongo

不要not从pypi安装“ bson”软件包。 PyMongo带有自己的bson软件包。执行“ easy_install bson”将安装与PyMongo不兼容的第三方软件包。

© www.soinside.com 2019 - 2024. All rights reserved.