2011-01-12 108 views
121

從MongoDB的權威指南:大於4MB較大理解MongoDB的BSON文獻大小限制

文檔(當轉換爲BSON)不能 保存到數據庫中。這是一個有點武斷的限制(可能會在將來提出 );主要是爲了防止糟糕的模式設計並確保性能一致。

我不明白這個限制,這是否意味着一個文檔包含一個博客文章,其中有很多評論,只是碰巧大於4MB而不能存儲爲單個文檔?

這也算嵌套文件嗎?

如果我想要一個審計值更改的文檔,該怎麼辦? (它最終可能會增長,超過4MB限制。)

希望有人正確解釋這一點。

我剛開始閱讀關於MongoDB(我正在學習的第一個nosql數據庫)。

謝謝。

+5

我認爲這個問題應該澄清,這是MongoDB的存儲文件大小的限制,而不是的BSON格式。 – alexpopescu 2011-01-12 14:03:16

+2

@alexpopescu,你是對的。 – saint 2011-01-12 14:48:10

+2

雖然,我只是試圖保存一個大大超過4MB的巨大文檔來獲取消息「BSON :: InvalidDocument:文檔太大:BSON文檔被限制爲4194304字節」。如果是這樣的話,在警告/錯誤信息中是不是有點誤導? – 2011-02-24 19:21:24

回答

108

首先,這實際上是在下一版本8MB16MB被提出......但我認爲把地理解這一點,從艾略特10gen的(誰開發的MongoDB)說得最好:

編輯:規模已經officially「提出」以16MB

所以,在你的博客例如,4MB是 實際上一大堆。例如, 全ü的「的 世界戰爭」 ncompresses文本只有364K(HTML): http://www.gutenberg.org/etext/36

如果你的博客文章是長着 很多意見,我對一個我不 要去看了吧:)

對於搬場,如果你致力於1MB 給他們,你可以輕鬆擁有更多 超過10K所以除了真正奇怪的 情況下(以20K可能接近)

,它會工作的偉大。而在 的例外情況或垃圾郵件,我真的 不認爲你會想要一個20MB的對象 無論如何。我認爲將引用限制爲 15k左右會產生很大的意義, 對於性能至關重要。或在 至少有特殊的外殼,如果它曾經 發生。

-Eliot

我想你會很很難達到極限......隨着時間的推移,如果升級...你會擔心越來越少。

限制的主要的一點是,這樣你就不是你的服務器上使用了所有的RAM(因爲你需要所有MB S上的文件加載到RAM中,當您進行查詢。)

所以這個限制是普通系統上正常可用內存的百分比......它會一年保持增長。

在MongoDB中

存儲文件如果你需要存儲的文件(或文件),比16MB大,你可以使用GridFS API將數據自動分解成段和流他們回到你(注從而避免與大小限制/ RAM的問題。)

而是在單個文檔中存儲的文件的,GridFS的劃分文件成零件,或組塊,並且存儲每個塊作爲一個單獨的文檔。

GridFS使用兩個集合來存儲文件。一個集合存儲文件塊,另一個存儲文件元數據。

您可以使用此方法將圖像,文件,視頻等存儲在數據庫中,就像在SQL數據庫中一樣。我用它甚至可以存儲多個千兆字節的視頻文件。

1

也許存儲博客文章 - >評論關係在非關係數據庫中並不是最好的設計。

無論如何,您應該將註釋存儲在一個單獨的集合中。

查看下面的評論進一步討論。

24

在社會上很多人會更願意與有關性能警告沒有限制,看到了充分的論證論點此評論: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283

我取,領先開發者固執這個問題,因爲他們決定了它是一個重要的「功能」在早期。他們不會很快改變它,因爲他們的感受受到任何人的質疑。性格和政治背離開源社區產品的另一個例子,但這不是一個真正的殘酷問題。

3

我還沒有看到沒有涉及大文件存儲在文件本身的限制問題。已經有多種數據庫在存儲/檢索大文件方面非常高效;他們被稱爲操作系統。數據庫作爲操作系統上的一層存在。如果您出於性能方面的原因使用NoSQL解決方案,那麼爲什麼要通過在應用程序和數據之間放置數據庫層來爲數據的訪問添加額外的處理開銷?

JSON是一種文本格式。因此,如果您通過JSON訪問數據,那麼如果您有二進制文件,尤其是這樣,因爲它們必須用uuencode,十六進制或Base 64編碼。該轉換路徑可能類似於

二進制文件<> JSON(編碼)<> BSON(編碼)

這將是更有效地把路徑(URL)的數據文件文檔中,並保持數據本身是二進制的。

如果你真的想在數據庫中保留這些長度未知的文件,那麼你最好將它們放在GridFS中,而不要冒着在訪問大文件時查殺併發性的風險。

18

要在這裏爲那些由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和嵌套的對象都計入文檔的大小。