164

来自 MongoDB 权威指南:

大于 4MB 的文档(转换为 BSON 时)无法保存到数据库中。这是一个有点武断的限制(将来可能会提高);它主要是为了防止糟糕的架构设计并确保一致的性能。

我不明白这个限制,这是否意味着包含大量评论且恰好大于 4MB 的博客文章的文档不能存储为单个文档?

这也算嵌套文档吗?

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

希望有人正确解释这一点。

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

谢谢你。

4

7 回答 7

134

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

编辑: 尺寸已正式“提高”到16MB

因此,在您的博客示例中,4MB 实际上是一大堆。例如,“世界大战”的完整解压缩文本只有 364k (html): http ://www.gutenberg.org/etext/36

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

对于 trackbacks,如果您将 1MB 专用于它们,您可以轻松拥有超过 10k(可能接近 20k)

所以除了真正奇怪的情况外,它会很好用。在例外情况或垃圾邮件中,我真的不认为你会想要一个 20mb 的对象。我认为无论性能如何,将引用限制为 15k 左右都很有意义。或者至少是特殊的外壳,如果它发生的话。

-艾略特

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

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

因此,限制是通用系统上正常可用 RAM 的一些百分比......这将逐年增长。

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

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

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

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

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

于 2011-01-12T10:31:37.063 回答
37

社区中的许多人都希望对性能警告没有限制,请参阅此评论以获得合理的论点: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin。 system.issuetabpanels:comment-tabpanel#comment-22283

我的看法是,主要开发人员对这个问题很固执,因为他们很早就认为这是一个重要的“功能”。他们不会很快改变它,因为任何人质疑它都会伤害他们的感情。另一个在开源社区中贬低产品的个性和政治示例,但这并不是一个严重的问题。

于 2012-07-10T19:47:35.683 回答
36

在这里为那些被谷歌指导的人发布一个澄清答案。

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

所以一个文件:

{
  "_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。

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

于 2013-10-16T11:08:25.613 回答
6

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

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

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

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

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

于 2013-06-20T21:07:41.777 回答
6

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

更多更多信息访问

于 2016-04-17T05:14:44.927 回答
1

也许将博客文章 -> 评论关系存储在非关系数据库中并不是最好的设计。

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

[编辑]

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

于 2011-01-12T10:25:08.157 回答
1

根据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')
  }
]
于 2019-04-24T03:10:43.187 回答