6

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

我正在为一些内容索引编写测试,为此我试图将一些二进制数据(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 对象传递给它。我尝试使用 base64 编码StringIO.getvalue(),并直接序列化相同的值。

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

4

2 回答 2

3

然而,谷歌组实际上是正确的,在发布后的某个时间,binary该类被移动到bson命名空间,因此您必须从那里导入它。

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

于 2013-08-14T07:07:46.030 回答
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. 根据pymongo 包描述

不要pypi 安装“bson”包。PyMongo 自带 bson 包;执行“easy_install bson”会安装与 PyMongo 不兼容的第三方包。

于 2020-04-17T15:13:06.793 回答