2013-02-20 31 views
0

我有超过16MB的文档。这些文档由许多键/值对及其包含的子文档(字典)和数组(列表)组成,这些文档可能嵌套深度较深。MongoDB的GridFS块只适用于二进制数据吗?什么是巨大的K/V文件?

如果我尝试插入其中一个超16MB文件,则会收到有关文档大小超过16MB的错误。所以,我开始关注GridFS。 GridFS似乎非常适合分割二进制数据等文件。但是,我不清楚我将如何像上面描述的那样“嵌套”高度嵌套的K/V文档。我想我可能只需要将这些庞大的文档分解成更小的文档并咬紧牙关并实施交易,因为在多个文档中没有插入的原子性。

我是否理解GridFS的方法?是否将文档分解为具有事务支持的较小文档是最好的方式,还是有办法在这里使用GridFS?

非常感谢您的关注。

回答

0

GridFS将文件视为不透明的二进制blob。它不会区分“关键/有价值文件”和图像文件。

如果您想对文档中包含的值进行查询等操作,则需要手动将它们分成较小的文档。另一方面,如果你的文档实际上只是不透明的具有内部结构的数据块(你只关心你的程序而不是数据库),那么GridFS是一个不错的选择。

另一个考虑因素是性能:你真的需要读写16MB +的巨型文档吗?或者你通常只处理每个文档的子集?如果前者使用GridFS;如果是后者,则将文档分成不同的集合,并在它们之间引用。

+0

感谢卡梅隆 - 只是想确定我没有误解GridFS。想想我需要打破文档,并围绕它进行一些交易。再次感谢! – SYNAX 2013-02-20 22:12:18

0

只是好奇你为什么要在文档而不是集合中存储键/值对?

如果你需要很多人,你可以将它们存储在一个集合中(假设它们都是唯一的而不是任何嵌套结构)。

或者,您可以将该数据迁移到redis,无论如何这将会更加高效地查找关键值,并且没有合理的限制。 可以混合多个存储引擎。如果您使用键值对16兆的文件中我真的怀疑你是如何现在建模数据

编辑回应评论1。仅仅因为数据库是无模式的,并不意味着将关键值存储在mongo中的正确方法是在一个大文档中。

您是否能够提供更多关于您正在尝试做什么的信息,以便我们能够更好地帮助理解您的需求并提供更好的答案?我相信我们可以帮助你更多。

+0

那么,原因那么我不得不担心交易的权利?你是否建议使用引用主实体的较小文档?我喜欢Redis的想法,但这意味着我需要做一些数据建模。关于mongo的好消息就是能够通过任意的文档处理它......不一定是坏事,可能仔细看看它......感谢您的回应。 – SYNAX 2013-02-20 22:14:15

+0

在回复上面的评论时添加了一个查询 - 您能否提供所需的详细信息? – JasonG 2013-02-21 01:55:52

相关问题