【问题标题】:Is MongoDB's GridFS Chunking Just for Binary Data? What about Huge K/V Documents?MongoDB 的 GridFS 分块仅适用于二进制数据吗?巨大的 K/V 文档呢?
【发布时间】:2013-02-20 22:04:32
【问题描述】:

我有超过 16MB 的文档。这些文档由许多键/值对及其包含的子文档(dicts)和数组(列表)组成,它们可能嵌套了好几层。

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

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

感谢您的关注。

【问题讨论】:

    标签: mongodb gridfs


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Cameron - 只是想确定我没有误解 GridFS。认为我需要分解文档并围绕它包装一些事务。再次感谢!
    【解决方案2】:

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

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

    或者您可以将这些数据迁移到 redis,这样在查找键/值时性能会更高,并且没有合理的限制。 多个存储引擎混用也没关系。

    根据评论 1 进行编辑:

    如果您在文档中使用 16 兆的键值对,我实际上会质疑您现在如何对数据进行建模。仅仅因为数据库是无模式的并不意味着在 mongo 中存储键值的正确方法是在一个大文档中。

    您能否提供更多关于您正在尝试做的事情的信息,以便我们更好地帮助您了解您的需求并提供更好的答案?我相信我们可以为您提供更多帮助。

    【讨论】:

    • 好吧,因为那我必须担心交易对吧?您是否建议参考主实体的较小文档?我喜欢 Redis 的想法,但这意味着我需要做一些数据建模。 mongo 的好处在于能够通过任意文档...不一定是坏事,可能会仔细研究一下...感谢您的回复。
    • 针对您的上述评论添加了一个查询 - 您能否提供所需的详细信息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2021-02-07
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多