2014-10-20 64 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