【问题标题】:How to deserialize BSON::Binary back into ruby hash?如何将 BSON::Binary 反序列化回 ruby​​ 哈希?
【发布时间】:2013-05-23 20:21:41
【问题描述】:

我正在使用 Anemone 将抓取的页面存储到 MongoDB 中。它主要工作,除了当我从 MongoDB 检索页面时访问页面标题。

当我调用collection.find_one("http://stackoverflow.com") 时,我将从数据存储中获取正确的对象,但我无法访问标题。

Anemone 将标题存储为哈希,因此理论上,在检索文档后,我应该能够执行类似的操作

document["headers"]["content-type"]

但这不起作用,因为 document["headers"] 是 BSON::Binary。

puts document["headers"]

显示文本和二进制字符的混合。

如何从 MongoDB 返回的二进制数据创建可用的 ruby​​ 哈希对象?

编辑:我还没有解决最初的问题,但能够修改 Anemone 以便我可以让它为我加载数据,这似乎工作:

class NewMongo < Anemone::Storage::MongoDB
    def initialize(mongo_db, collection_name)
        @db = mongo_db
        @collection = @db[collection_name]
        #Do not delete the collection! I need it!
        #@collection.remove
        @collection.create_index 'url'
    end
end

后来……

repo = NewMongo.new(db, "pages")
repo.each db |url, page|
    puts page.content_type
end

【问题讨论】:

  • 你有没有挖掘过 Anemone 的源代码来找到它将标头放入 MongoDB 的位置? Anemone 文档有什么要说的吗?这至少可以告诉你它使用的是什么格式。
  • 是的,但这没有任何帮助。看着github.com/chriskite/anemone/blob/next/lib/anemone/page.rb 它似乎在 to_hash 中做'headers' =&gt; Marshal.dump(@headers)。 MongoDB 适配器 (github.com/chriskite/anemone/blob/next/lib/anemone/storage/…) 然后创建 BSON 对象:hash[field] = BSON::Binary.new(hash[field]) unless hash[field].nil?
  • Marshal.dump 电话有点白送,不是吗?用Marshal.dump打包的东西怎么解压?
  • 我想如果我不是初学者,我会同意你的讽刺。但是,我确实尝试了Marshal.load(...),它告诉我“需要 IO 实例”。而且,与 ruby​​ 的大多数事情一样,在谷歌上搜索该错误的帮助并没有产生任何有用的提示。
  • 您可以尝试BSON::Binary 对象上的data 方法来获取原始数据,然后将其提供给Marshal 方法之一。我没有设置 Anemone,所以我无法确切告诉你该怎么做,我所能做的就是根据一些研究提供一些可能性。我必须承认,当使用 MongoDB 进行存储时,我发现 Anemone 在这里的行为非常奇怪,我不知道他们为什么不直接将整个 Hash 放入其中,MongoDB 会很高兴的。

标签: ruby mongodb anemone


【解决方案1】:

如果数据是由 Anemone 存储后端以二进制格式存储的,那么除非您知道格式或它们提供的反序列化器,否则您无能为力。听起来这对于存储标头来说是一个糟糕的选择,因为散列对于它来说是一种更自然的形式。

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2016-02-14
    • 2011-09-02
    • 2012-01-28
    • 2019-02-19
    相关资源
    最近更新 更多