了解 MongoDB BSON 文档大小限制

来自 MongoDB 最终指南:

大于4MB (转换为 BSON 时)的文件不能 保存到数据库。这是一个有点武断的限制(可能是 它主要是为了防止坏的模式设计和确保 始终如一的表现。

我不明白这个限制,这是否意味着一个文档包含一个博客帖子与许多评论,只是碰巧大于4MB 不能存储为一个单一的文档?

这也算嵌套文档吗?

如果我想要一个文档来审计对一个值的更改。(最终可能会增加,超过4MB 的上限。)

希望有人能解释清楚。

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

谢谢你。

129289 次浏览

也许将 blog post-> 注释 关系存储在非关系数据库中并不是真正的最佳设计。

无论如何,您应该将评论存储在单独的博客文章集合中。

[编辑]

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

首先,这实际上是在下一个版本的 8MB或者 16MB中提出来的... ... 但是我认为把这个放在一个角度来看,来自10gen 的 Eliot (他开发了 MongoDB)说得最好:

编辑: < em > 大小已经被 正式的‘提高’到 16MB

因此,在您的博客示例中,4MB 是 实际上有很多... 比如说, 完整的解压缩文本“战争的 只有364k (html) : Http://www.gutenberg.org/etext/36

如果你的博客文章那么长 那么多的评论,我个人是不会的 读一下:)

对于 trackback,如果专用1MB 对他们来说,你可以轻而易举地拥有更多 大于10000米(可能接近20000米)

除了非常奇怪 情况下,它会工作得很好。并在 例外情况或垃圾邮件,我真的 你不会想要一个20mb 的对象吧 不管怎么说,我觉得给 Trackback 定义上限 一万五左右很有道理,不 无论表现如何 最不特别的外壳 发生了。

艾略特

我认为你很难达到极限... 随着时间的推移,如果你升级... 你会越来越少担心。

这个限制的主要目的是为了不用完服务器上的所有 RAM (因为在查询文档时需要将文档的所有 MB加载到 RAM 中)

所以这个限制是一个公共系统上正常可用内存的一部分... ... 这将保持年复一年的增长。

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

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

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

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

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

社区中的许多人希望对性能的警告没有限制,看看下面这条评论,你会发现一个很有道理的论点: Https://jira.mongodb.org/browse/server-431?focusedcommentid=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

在我看来,主要开发人员在这个问题上很顽固,因为他们很早就认为这是一个重要的“特性”。他们不会很快改变,因为他们的感情受到了伤害,任何人都质疑它。在开源社区中,个性和政治分散了产品的注意力,这是另一个例子,但这并不是一个严重的问题。

我还没有看到不涉及存储在文档本身中的大文件的限制的问题。已经有各种各样的数据库可以非常有效地存储/检索大型文件; 它们被称为操作系统。数据库作为操作系统的一层存在。如果出于性能原因使用 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 }, {}] }
]
}

最大大小为16MB。

子文档和嵌套对象都计入文档的大小。

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

更多信息访问

根据 https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-1

如果您预计一篇博客文章可能超过16Mb 的文档限制,那么您应该将评论提取到一个单独的集合中,并从评论中引用博客文章,然后执行应用程序级别的连接。

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


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