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

时间:2013-08-13 15:43:33

标签: python mongodb encoding pymongo binaryfiles

我正在尝试做一些我认为非常微不足道的事情,所以请原谅我,如果其他地方有一些简单的解决方案。

我正在为一些内容索引编写测试,为此我试图将一些二进制数据(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认识到我发送的是原始二进制文件。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

这可以通过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的一部分,尽管是顶级包。根据{{​​3}}:

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