MongoDB中單對象大小超16M的存儲方案
在 MongoDB 中,單個文檔的大小限制為 16MB。如果某個對象(文檔)的大小超過 16MB,可以通過以下幾種方案解決:
1. 使用 GridFS
適用場景:需要存儲大文件(如圖像、視頻、文檔等)。
原理
- MongoDB 的 GridFS 是一種專門用于存儲超過 16MB 文件的工具。
- 它會將大文件分割成多個 chunk(默認大小 255KB),并存儲在兩個集合中:
fs.files:存儲文件的元數(shù)據(jù)(如文件名、大小、類型等)。fs.chunks:存儲文件的內(nèi)容分塊。
實現(xiàn)步驟
存儲大文件 使用 MongoDB 驅(qū)動的 GridFS 工具存儲文件。
Python 示例:
from pymongo import MongoClient
from gridfs import GridFS
client = MongoClient("mongodb://localhost:27017")
db = client.myDatabase
fs = GridFS(db)
# 存儲文件
with open("large_file.bin", "rb") as f:
fs.put(f, filename="large_file.bin")讀取大文件
# 讀取文件
file_data = fs.get_last_version(filename="large_file.bin")
with open("output.bin", "wb") as f:
f.write(file_data.read())2. 將文檔拆分為多個小文檔
適用場景:文檔包含大量嵌套數(shù)據(jù),導(dǎo)致總大小超過 16MB。
解決思路
- 將大文檔拆分成多個子文檔。
- 使用字段(如
_id或parentId)將這些子文檔關(guān)聯(lián)起來。
實現(xiàn)步驟
示例:拆分用戶日志記錄 原始大文檔(超 16MB):
{ "_id": "user1", "logs": [ { "timestamp": "2025-01-01", "action": "login" }, ... ] }拆分為多個小文檔:
// 主文檔
{ "_id": "user1", "type": "userMetadata" }
// 子文檔
{ "parentId": "user1", "logs": [ { "timestamp": "2025-01-01", "action": "login" }, ... ] }
查詢時合并:
db.metadata.find({ _id: "user1" });
db.logs.find({ parentId: "user1" });3. 使用 BSON 對象數(shù)組存儲引用
適用場景:需要在文檔中存儲大量關(guān)聯(lián)對象。
解決思路
- 將大數(shù)組分割到其他集合中,主文檔存儲引用。
示例
大文檔超限前:
{ "_id": "project1", "name": "Big Project", "tasks": [ /* 超大量任務(wù)數(shù)據(jù) */ ] }優(yōu)化后:
// 主文檔
{ "_id": "project1", "name": "Big Project" }
// 任務(wù)文檔
{ "projectId": "project1", "taskId": 1, "taskName": "Task 1", ... }查詢時通過 projectId 關(guān)聯(lián):
db.projects.find({ _id: "project1" }); db.tasks.find({ projectId: "project1" });4. 壓縮數(shù)據(jù)
適用場景:文檔中包含重復(fù)數(shù)據(jù)或可壓縮結(jié)構(gòu)(如 JSON 數(shù)據(jù))。
解決思路
- 在存儲之前壓縮數(shù)據(jù)(例如使用 GZIP、Zlib 等)。
- 查詢時解壓數(shù)據(jù)。
示例
Python 實現(xiàn):
import zlib
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
db = client.myDatabase
collection = db.myCollection
# 壓縮存儲
data = {"key": "value" * 10000}
compressed_data = zlib.compress(str(data).encode("utf-8"))
collection.insert_one({"_id": "compressed_doc", "data": compressed_data})
# 解壓讀取
doc = collection.find_one({"_id": "compressed_doc"})
decompressed_data = zlib.decompress(doc["data"]).decode("utf-8")5. 修改數(shù)據(jù)結(jié)構(gòu)
適用場景:文檔設(shè)計冗余或結(jié)構(gòu)不合理。
解決思路
- 簡化嵌套層級。
- 使用更緊湊的數(shù)據(jù)類型(如數(shù)組代替對象)。
優(yōu)化前:
{ "_id": "order1", "customer": { "id": 1, "name": "John Doe" }, "items": [ { "productId": "p1", "productName": "Product 1", "quantity": 2 } ] }優(yōu)化后:
{ "_id": "order1", "customerId": 1, "items": [ { "p": "p1", "q": 2 } ] }6. 使用文件系統(tǒng)或其他存儲服務(wù)
適用場景:非結(jié)構(gòu)化大數(shù)據(jù)(如媒體文件、大型JSON)。
解決思路
- 將大數(shù)據(jù)存儲到文件系統(tǒng)、Amazon S3、Azure Blob 等。
- 在 MongoDB 中存儲文件路徑或 URL。
總結(jié)
- 優(yōu)先選擇方案:
- 使用 GridFS 存儲大文件。
- 拆分文檔 或 分表設(shè)計 解決超大文檔問題。
- 結(jié)合壓縮或外部存儲進一步優(yōu)化。
以上就是MongoDB中單對象大小超16M的存儲方案的詳細內(nèi)容,更多關(guān)于MongoDB單對象大小超16M的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MongoDB??數(shù)據(jù)模型的設(shè)計模式及優(yōu)缺點
這篇文章主要介紹了MongoDB??數(shù)據(jù)模型的設(shè)計模式,在實際開發(fā)中,大多數(shù)性能問題都可以追溯到糟糕的模型設(shè)計,官方也提供分享過文檔模型設(shè)計的進階技巧,這里簡單翻譯記錄一下,需要的朋友可以參考下2022-12-12
mongodb實現(xiàn)數(shù)組對象求和方法實例
這篇文章主要給大家介紹了關(guān)于mongodb實現(xiàn)數(shù)組對象求和的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-01-01
Linux系統(tǒng)下MongoDB的簡單安裝與基本操作
這篇文章主要介紹了Linux系統(tǒng)下MongoDB的簡單安裝與基本操作,需要的朋友可以參考下2015-04-04
Win10 64位安裝MongoDB數(shù)據(jù)庫的詳細教程
這篇文章主要介紹了Win10 64位安裝MongoDB數(shù)據(jù)庫的詳細教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
Ubuntu環(huán)境下mongodb安裝配置詳細步驟
大家好,本篇文章主要講的是Ubuntu環(huán)境下mongodb安裝配置詳細步驟,感興趣的同學快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-11-11
Centos系統(tǒng)搭建MongoDB數(shù)據(jù)庫
這篇文章介紹了Centos系統(tǒng)搭建MongoDB數(shù)據(jù)庫的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
MongoDB數(shù)據(jù)庫聚合之分組統(tǒng)計$group的用法詳解
在MongoDB中聚合框架允許用戶對數(shù)據(jù)進行處理和分析,以便進行統(tǒng)計計算、匯總以及更復(fù)雜的數(shù)據(jù)轉(zhuǎn)換,這篇文章主要給大家介紹了關(guān)于MongoDB數(shù)據(jù)庫聚合之分組統(tǒng)計$group的用法的相關(guān)資料,需要的朋友可以參考下2024-06-06

