【发布时间】: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' => 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 会很高兴的。