【问题标题】:Insert Binary data into Mongo field in pymongo将二进制数据插入 pymongo 中的 Mongo 字段
【发布时间】:2013-08-13 15:43:33
【问题描述】:

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

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

【问题讨论】:

  • 你在google群里使用版本的时候试过什么代码?你得到了什么错误?应该有一个二进制助手可以用来在 mongo 中存储二进制信息
  • @Sammaye 我尝试了如图所示的示例。你知道二进制助手在哪里吗?因为它不是 python 的一部分,所以它不在 pymongo 文档中,而且它似乎不存在于任何相关的 python 模块中。
  • 您必须从 pymongo 驱动程序中导入它,这是一个完整的示例:stackoverflow.com/questions/11915770/saving-picture-to-mongodb,这是文档:api.mongodb.org/python/current/api/bson/binary.html
  • @Sammaye 您刚刚将我指向两个完全不同的事情 D:第一个链接中的 import 语句对我不起作用,我使用的是 pymongo 2.4.1,也许它是最近推出的?第二个链接更有帮助。你想把这个作为答案,以便我给你信用吗?似乎很多关于此功能的传说至少有些错误。
  • 是的,现在我相信:github.com/Fiedzia/Fang-of-Mongo/issues/11 二进制文件已被移动

标签: python mongodb encoding pymongo binaryfiles


【解决方案1】:

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

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

【讨论】:

    【解决方案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 package description

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

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 2010-11-10
      • 2020-09-12
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2013-12-14
      相关资源
      最近更新 更多