MongoDB的BSON gem无法读取MongoDB数据库文件?

时间:2011-08-09 19:37:24

标签: ruby-on-rails mongodb typeerror bson

我有一个带有一些数据的MongoDB DB。一切正常,数据被正确插入mongo DB。不过,我现在要做的是打开mongoDB数据库文件,并使用BSON gem解析它,以便我可以查看mongo数据库文件的人性化格式。

data = nil

File.open("input/bson/database_development.0") do |f|
  data = f.read
end

unpacked_data = BSON.deserialize(data)

File.new("input/bson/output.txt", "w") do |f|
  f.write(unpacked_data)
end

然而,这给了我以下错误:

/home/user/.rvm/gems/ruby-1.9.2-p180/gems/bson-1.3.1/lib/bson/bson_c.rb:28:in `deserialize': no c decoder for this type yet (-86) (TypeError)
from /home/user/.rvm/gems/ruby-1.9.2-p180/gems/bson-1.3.1/lib/bson/bson_c.rb:28:in `deserialize'
from /home/user/.rvm/gems/ruby-1.9.2-p180/gems/bson-1.3.1/lib/bson.rb:37:in `deserialize'
from bsoner.rb:16:in `<main>'

从谷歌稍微说,有些人说mongoDB可以接受任何类型的输入并存储它,但不能只读取任何类型的数据。所以他们说数据库文件中包含了无法正确读取的错误数据。但它不应该能够读取它可以插入的任何内容吗?

2 个答案:

答案 0 :(得分:3)

添加到Emily的答案:您可以使用一些实用程序直接检查文件。首先,使用mongodump转储数据库:

mongodump

这会将数据文件转储到原始BSON。

然后你可以用bsondump检查bson:

bsondump dump/test/foo.bson

还有一个随gem附带的Ruby实用程序:

b2json dump/test/foo.bson

答案 1 :(得分:2)

MongoDB不是基于文件的数据库。为了读取数据,您需要连接到正在运行的MongoDB服务器。 BSON gem用于解析服务器返回的数据,而不是解析文件本身。

要连接到MongoDB服务器并读取数据,您将执行以下操作:

require 'rubygems'
require 'mongo'

connection = Mongo::Connection.new # connects to localhost by default
db   = connection['sample-db']
collection = db['test']

outfile = File.open('output.txt', 'w')
collection.find.each { |doc| outfile.puts doc.inspect }

collectiondb对象具有其他方法,可以让您获得所有数据库和集合的列表,如果您还需要打印所有数据库和集合中的数据。有关详细信息,请查看API documentation for the mongo gem