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ù)組查詢(AngularJS綁定顯示 nodejs)
這篇文章主要介紹了mongoDB 多重數(shù)組查詢(AngularJS綁定顯示 nodejs),需要的朋友可以參考下2017-06-06MongoDB數(shù)據(jù)庫安裝配置、基本操作實例詳解
這篇文章主要介紹了MongoDB數(shù)據(jù)庫安裝配置、基本操作,結(jié)合實例形式詳細分析了MongoDB數(shù)據(jù)庫安裝配置具體步驟、相關(guān)命令與基本操作實現(xiàn)技巧,需要的朋友可以參考下2020-01-01MongoDB系列教程(三):Windows中下載和安裝MongoDB
這篇文章主要介紹了MongoDB系列教程(三):MongoDB下載和安裝,本文講解使用Windows環(huán)境安裝MongoDB,需要的朋友可以參考下2015-05-05MongoDB模糊查詢操作案例詳解(類關(guān)系型數(shù)據(jù)庫的 like 和 not like)
這篇文章主要介紹了MongoDB的模糊查詢操作(類關(guān)系型數(shù)據(jù)庫的 like 和 not like) ,本文通過代碼案例分析給大家介紹的非常詳細,具有一定的參考借鑒價值,,需要的朋友可以參考下2019-07-07