2012-06-25 31 views
14

簡而言之:如果您有大量不同大小的文檔,只有相對較少的文檔達到最大對象大小,那麼將這些文檔存儲在MongoDB中的最佳做法是什麼?在MongoDB中存儲非常大的文檔

我已經設置了一個文件,如:

{_id: ..., 
    values: [12, 13, 434, 5555 ...] 
} 

值列表的長度變化巨大,從一個到另一個文件。對於大多數文檔來說,它會有一些元素,少數元素會有數千萬個元素,並且我將達到MongoDB中的最大對象大小限制。麻煩的是,我爲這些非常大(且相對較少)的文檔提出的任何特殊解決方案可能會影響我如何存儲小文檔,否則,這些小文檔會愉快地生活在MongoDB集合中。

據我所知,我有以下選擇。我將不勝感激任何有關這些利弊的意見,以及我錯過的任何其他選項。

1)使用另一個數據存儲:這看起來太激烈了。我喜歡MongoDB,這不像我對許多對象造成的大小限制。在案例中,我的應用程序可以以不同的方式處理非常大的對象和其他對象。它看起來並不高雅。 2)使用GridFS存儲值:像傳統DB中的blob,我可以在文檔中保留前幾千個元素的值,並且如果列表中有更多元素,我可以將其餘元素保留在GridFS對象作爲二進制文件。我不能在這部分搜索,但我可以忍受這一點。

3)濫用GridFS:我可以保留每個文件在gridFS中。對於大多數(小)文檔來說,二進制塊將是空的,因爲文件集合將能夠保存所有內容。其餘的我可以將多餘的元素保留在塊集合中。與選項#2相比,是否會引入開銷?

4)真正濫用GridFS:我可以使用GridFS的文件集合中的可選字段來存儲值中的所有元素。 GridFS是否也對文件集合進行智能分塊?

5)使用額外的「關係」集合來存儲一對多關係,但這個集合中的文檔數量很容易超過1000億行。

+0

您是否需要以任何方式查詢這些可選字段? – Thilo

+1

「GridFS是否也對文件集合進行智能分塊?」。不需要。文件元數據必須適合單個BSON文檔。 – Thilo

+0

更新/插入需要什麼樣的原子性? – Thilo

回答

1

如果你有大的文檔,嘗試在MongoDB中存儲一些關於它們的元數據,並把其餘的數據 - 你不會查詢的部分 - 放在外面。

相關問題