了解MongoDB BSON文档大小限制

时间:2011-01-12 10:18:06

标签: mongodb bson

来自MongoDB The Definitive Guide:

  

大于4MB的文件(转换为BSON时)不能   保存到数据库中。这是一个有点任意的限制(可能是   在未来筹集);它主要是为了防止错误的架构设计和确保   一致的表现。

我不明白这个限制,这是否意味着包含博客文章的文档大量超过4MB并不能存储为单个文档?

这也会计算嵌套文档吗?

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

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

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

谢谢。

7 个答案:

答案 0 :(得分:115)

首先,这实际上是在下一个版本中提升到8MB16MB ...但是我认为这要考虑到这一点,来自10gen(开发MongoDB)的Eliot说得最好:

编辑: 此尺寸已officially'已筹集'至16MB

  

所以,在你的博客示例中,4MB是   实际上很多..例如,   全面解压缩“战争之战”   世界“只有364k(html):   http://www.gutenberg.org/etext/36

     

如果你的博客文章很长   那么多评论,我不是   去读它:)

     

对于引用,如果您专用1MB   对他们来说,你可以轻松拥有更多   超过10k(可能接近20k)

     

所以除了真正奇怪的   情况,它会很棒。并在   例外情况或垃圾邮件,我真的   不要以为你想要一个20mb的物体   无论如何。我认为将引用视图限制为   15k左右很有意义   无论表现如何。或   如果有的话,最不特殊的外壳   发生的情况。

     

-Eliot

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

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

因此,限制是普通系统上正常可用RAM的百分之几......它将逐年增长。

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

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

  

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

     

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

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

答案 1 :(得分:27)

社区中的许多人对性能的警告不会有任何限制,请参阅此评论以获得一个充分理由的论点: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

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

答案 2 :(得分:23)

此处为Google上的人员提供澄清答案。

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

所以文件:

{
    _id:{},
    na: [1,2,3],
    naa: [
        {w:1,v:2,b:[1,2,3]},
        {w:5,b:2,h:[{d:5,g:7},{}]}
    ]
}

最大尺寸为16美分。

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

答案 3 :(得分:4)

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

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

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

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

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

答案 4 :(得分:4)

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

More more info vist

答案 5 :(得分:2)

也许存储博客文章 - >非关系型数据库中的注释关系并不是最好的设计。

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

[编辑]

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

答案 6 :(得分:0)

根据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')
  }
]