我有一个填充的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
答案 0 :(得分:1)
我建议采用两种方法:
GridFS ,其中包含说明https://github.com/mongodb/mongo-ruby-driver/wiki/GridFS
优势:使用现有服务(mongodb)来存储文件,因此您可能最容易实施/最便宜,因为您已拥有基础架构。
缺点:最好不要使用内存数据库,特别是如果它也用于其他存储空间。
S3 - 存储指向托管数据服务(例如Amazon S3)的链接,该服务专为文件存储而设计(冗余,复制和高可用性)。在这种情况下,您只需上传文件并将指针存储到数据库中的S3位置。
优势保持您的数据库更精简,可能更便宜,因为您保持mongo机器优化为mongo事物(即高内存)并利用S3上非常便宜的文件存储以及近乎无限的可扩展性。
缺点实施起来比较困难,因为您需要设计自己的代码才能执行此操作。虽然某处可能有现成的解决方案。
答案 1 :(得分:1)
也许您可以拆分文档并引用它们。请参阅此SO帖子:syntax for linking documents in mongodb
答案 2 :(得分: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