了解MongoDB BSON文档大小限制

了解MongoDB BSON文档大小限制,mongodb,bson,Mongodb,Bson,来自MongoDB的最终指南: 大于4MB的文档(转换为BSON时)不能被删除 保存到数据库中。这是一个有点武断的限制(可能是 在未来提出);它主要是为了防止糟糕的模式设计并确保 始终如一的表现 我不理解这个限制,这是否意味着一个包含大量评论的博客文章的文档(恰好大于4MB)不能存储为单个文档 这也包括嵌套文档吗 如果我想要一个文档来审核对值的更改,该怎么办。(它最终可能会增长,超过4MB限制。) 希望有人能正确地解释这一点 我刚刚开始阅读MongoDB(我正在学习的第一个nosql数据库) 谢

来自MongoDB的最终指南:

大于4MB的文档(转换为BSON时)不能被删除 保存到数据库中。这是一个有点武断的限制(可能是 在未来提出);它主要是为了防止糟糕的模式设计并确保 始终如一的表现

我不理解这个限制,这是否意味着一个包含大量评论的博客文章的文档(恰好大于4MB)不能存储为单个文档

这也包括嵌套文档吗

如果我想要一个文档来审核对值的更改,该怎么办。(它最终可能会增长,超过4MB限制。)

希望有人能正确地解释这一点

我刚刚开始阅读MongoDB(我正在学习的第一个nosql数据库)


谢谢。

也许在非关系型数据库中存储博客帖子->评论关系并不是最好的设计

无论如何,您可能应该将评论存储在单独的博客帖子集合中

[编辑]


请参阅下面的评论以进行进一步讨论。

首先,在下一个版本中,这实际上被提升为
8MB
16MB
。。。但我认为,要正确看待这一点,10gen的Eliot(开发MongoDB的人)说得最好:

编辑:大小已“提升”到
16MB

因此,在您的博客示例中,4MB是 事实上很多。。例如 “战争”的完整解压文本 “世界”只有364k(html):

如果你的博客文章有那么长 那么多的评论,我就一个都不是 去读:)

对于Trackback,如果您专用1MB 对他们来说,你很容易就能得到更多 超过10k(可能接近20k)

所以除了真的很奇怪 在这种情况下,它会起到很好的作用。而且 例外情况或垃圾邮件,我真的 不要认为你会想要一个20mb的对象 无论如何我认为把trackback封顶为 15k左右很有意义不 无论什么样的表现。或 最少的特殊外壳 发生了

-艾略特

我想你很难达到极限。。。随着时间的推移,如果你升级。。。你将不得不越来越少地担心

限制的要点是,您不会耗尽服务器上的所有RAM(因为您需要在查询文档时将文档的所有
MB
s加载到RAM中)。

所以限制是普通系统上正常可用RAM的%左右。。。它将逐年增长

关于在MongoDB中存储文件的注意事项

如果需要存储大于
16MB的文档(或文件),可以使用,它会自动将数据分割成段并流式返回给您(从而避免大小限制/RAM的问题)

GridFS没有将文件存储在单个文档中,而是将文件划分为多个部分或块,并将每个块存储为单独的文档

GridFS使用两个集合来存储文件。一个集合存储文件块,另一个存储文件元数据


您可以使用此方法在数据库中存储图像、文件、视频等,就像在SQL数据库中一样。我甚至用它来存储数千兆字节的视频文件。

社区中的许多人更喜欢没有性能警告的限制,请参阅此评论以获得一个合理的论点:


我的理解是,首席开发人员对这个问题很固执,因为他们很早就认为这是一个重要的“特性”。他们不会很快改变它,因为任何人质疑它都会伤害他们的感情。另一个例子是,在开源社区中,个性和政治削弱了产品,但这并不是一个真正严重的问题。

我还没有看到不涉及文档本身中存储的大型文件的限制存在问题。已经有各种各样的数据库在存储/检索大型文件方面非常有效;它们被称为操作系统。数据库作为操作系统上的一个层存在。如果出于性能原因使用NoSQL解决方案,为什么要通过在应用程序和数据之间放置DB层来增加数据访问的额外处理开销

JSON是一种文本格式。因此,如果您是通过JSON访问数据的,那么如果您有二进制文件,则尤其如此,因为它们必须以uuencode、十六进制或Base 64编码。转换路径可能如下所示

二进制文件JSON(编码)BSON(编码)

将数据文件的路径(URL)放在文档中,并将数据本身保持为二进制,这样会更有效


如果您真的想在数据库中保留这些长度未知的文件,那么最好将这些文件放在GridFS中,而不要冒着在访问大文件时破坏并发性的风险。

在这里为那些受到谷歌指导的人发布澄清答案

文档大小包括文档中的所有内容,包括子文档、嵌套对象等

因此,以下文件:

{
“_id”:{},
“na”:[1,2,3],
“naa”:[
{“w”:1,“v”:2,“b”:[1,2,3]},
{“w”:5,“b”:2,“h”:[{“d”:5,“g”:7},{}]}
]
}
最大大小为16 MB


子文档和嵌套对象都按文档大小计算。

BSON文档的嵌套深度: MongoDB支持的BSON文档嵌套级别不超过100级

根据

如果您预计博客文章可能会超过16Mb文档限制,则应将评论提取到单独的集合中,并从评论中引用博客文章,并进行应用程序级连接

// posts
[
  {
    _id: ObjectID('AAAA'),
    text: 'a post',
    ...
  }
]

// comments
[
  {
    text: 'a comment'
    post: ObjectID('AAAA')
  },
  {
    text: 'another comment'
    post: ObjectID('AAAA')
  }
]

我完全不同意。在MongoDB中,您的博客文章文档中的评论应该是完美的。。。这是一个非常常见的用法(我用我的