HOWTO · MongoDB

MongoDB 最大文件大小

本教程描述了 MongoDB 中的最大文件大小限制。它還講述瞭如何有效地使用預設的 BSON 大小限制並在超出儲存文件的限制時儲存資料。

本頁內容

MongoDB 每份 BSON 文件的大小上限為 16 MB。若記錄超過此上限,請縮減其編碼後的大小,或將部分資料移至其他文件;若要儲存大型檔案,則可考慮使用 GridFS。此限制適用於單一文件,不適用於整個集合的總大小,也不適用於由多份 GridFS 文件表示的檔案。

MongoDB 的 BSON 文件大小上限

MongoDB 會以 BSON 儲存記錄。BSON 是一種用於表示類似 JSON 文件的二進位格式,並支援日期與二進位資料等額外資料類型。MongoDB 限制說明文件指出,單份 BSON 文件的大小上限為 16 MB,巢狀深度上限為 100 層。陣列與嵌入式文件都會計入巢狀深度。

大小是以編碼後的 BSON 文件計算,包含欄位名稱、型別標記、長度及其他結構性額外負擔。因此,JSON 字串的大小或值的數量本身,無法判斷文件是否符合上限。設計記錄時,請預留低於上限的空間;在依賴大小估算前,請使用應用程式所用驅動程式的 BSON 工具測量具代表性的文件。

GridFS 如何儲存超過文件大小上限的檔案

GridFS 是 MongoDB 的一項規格,用於儲存與取回超過單份文件大小上限的檔案。GridFS 實作會將檔案切分成區塊,並分別儲存為多份文件。預設情況下,它會使用 fs.files 集合儲存檔案中繼資料,並使用 fs.chunks 集合儲存區塊資料。檔案文件會識別該檔案,而每個區塊則透過 files_id 指向該檔案。

這種結構可讓大型檔案分段處理,但不會讓單份超大 BSON 文件變得有效。請使用 MongoDB 驅動程式提供的 GridFS 支援來上傳、取回或串流處理檔案。區塊大小與 API 細節會依實作和設定而異,請參閱所用驅動程式的說明文件。

如何讓 BSON 文件維持在大小上限內

首先,檢查哪些欄位占用了大部分的編碼後大小。移除可推導出的資料,避免重複儲存大型值,並在仍易於理解與維護的前提下選用較精簡的表示方式。只有在應用程式能儲存並解讀壓縮後的二進位資料時,在應用程式程式碼中壓縮字串才有用;這也會增加處理成本與相容性考量。

若某個欄位只有少數幾種重複字串,字典編碼可以將每個不同字串只儲存一次,再以索引表示各次出現。以下 Python 範例示範如何在記憶體中進行這項轉換;它不會計算 BSON 大小,也不會連線至 MongoDB。

執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

values = ["pending", "complete", "pending", "pending"]
dictionary = list(dict.fromkeys(values))
indexes = [dictionary.index(value) for value in values]
print(dictionary)
print(indexes)

字典編碼可以減少重複文字,但索引會讓記錄較難檢視,而且必須確保字典持續可用且內容一致。若值大多不重複,這種做法可能沒有幫助;新增的結構本身也會占用空間。請測量具代表性的編碼後文件,不要假設轉換後就一定符合大小上限。

資料超過大小上限時如何選擇儲存方式

若資料彼此相關,而且能在不遺失必要資訊的情況下以更精簡的方式表示,請使用較小的文件。若資料各部分有各自的生命週期,或會分開讀取,則可將資料拆分成彼此關聯的文件;請保留穩定的識別碼或參照,讓應用程式能取回相關記錄。這可能使查詢需要額外讀取,也代表更新相關資料時需要謹慎處理。

若應用程式需要 MongoDB 的檔案儲存與取回功能,可使用 GridFS 儲存圖片、音訊或影片等大型檔案內容。可搜尋或經常查詢的屬性應保留在一般文件中,並在其中儲存指向 GridFS 檔案的參照。GridFS 並非所有超大記錄的預設解法:請先判斷資料是檔案、相關的結構化資料,還是單純能縮減大小的文件。