2014-10-20 65 views
0

我有一个填充的mongoDB。红宝石mongoDB和大文档

现在我需要向我的文档(日志文件数据)添加大量的额外数据。该数据超出BSON大小限制。

文档太大:此BSON文档限于16777216字节。 (BSON :: InvalidDocument)

我的情况一个简单的例子是这样的:

cli = MongoClient.new("localhost", MongoClient::DEFAULT_PORT) 
db = cli.db("testdb") 
coll = db.collection("test") 

data = {:name => "Customer1", :data1 => "some value", :log_file => "A" * 17_000_000} 

coll.save data 
  1. 什么是添加这个庞大的数据量的最佳方法?
  2. 我可以使用GridFS存储这些文件并将GridFS文件句柄链接到正确的文档吗?
    1. 我可以在查询期间访问GridFS文件吗?

回答

1

该段约文件增长终于解决了我的问题。 (根据Konrad的链接找到。)

http://docs.mongodb.org/manual/core/data-model-operations/#data-model-document-growth

什么,我现在基本上做的是这样的:

cli = MongoClient.new("localhost", MongoClient::DEFAULT_PORT) 
db = cli.db("testdb") 
coll = db.collection("test") 
grid = Grid.new db 

#store data 
id = grid.put "A"*17_000_000 
data = {:name => "Customer1", :data1 => "some value", :log_file => id} 
coll.save data 

#access data 
cust = coll.find({:name => "Customer1"}) 
id = cust.first["log_file"] 
data = grid.get id 
1

我建议两种方法:

GridFS的在这里说明https://github.com/mongodb/mongo-ruby-driver/wiki/GridFS

  • 优点:使用已经存在的服务(MongoDB的)来存储文件,所以可能最简单的实施/最便宜的,因为你已经有了基础设施。

  • 缺点:对内存数据库的最佳使用并非必不可少,尤其是在用于其他存储的情况下。

S3 - 其被设计用于文件存储(冗余,复制和高可用性)店铺链接到托管的数据服务(例如Amazon S3)。在这种情况下,您只需上传文件并在您的数据库中存储指向其S3位置的指针。

  • 优势保持你的数据库精简,可能更便宜,因为你把你的蒙戈机器做蒙戈的事情(即高内存)进行了优化,并充分利用S3的真便宜文件存储以及附近无限可扩展性。

  • 缺点难以实施,因为您需要设计自己的代码来执行此操作。尽管可能存在某种地方的现成解决方案。

this SO post