MongoDB中單對象大小超16M的存儲方案
在 MongoDB 中,單個文檔的大小限制為 16MB。如果某個對象(文檔)的大小超過 16MB,可以通過以下幾種方案解決:
1. 使用 GridFS
適用場景:需要存儲大文件(如圖像、視頻、文檔等)。
原理
- MongoDB 的 GridFS 是一種專門用于存儲超過 16MB 文件的工具。
- 它會將大文件分割成多個 chunk(默認大小 255KB),并存儲在兩個集合中:
fs.files
:存儲文件的元數據(如文件名、大小、類型等)。fs.chunks
:存儲文件的內容分塊。
實現步驟
存儲大文件 使用 MongoDB 驅動的 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. 將文檔拆分為多個小文檔
適用場景:文檔包含大量嵌套數據,導致總大小超過 16MB。
解決思路
- 將大文檔拆分成多個子文檔。
- 使用字段(如
_id
或parentId
)將這些子文檔關聯起來。
實現步驟
示例:拆分用戶日志記錄 原始大文檔(超 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 對象數組存儲引用
適用場景:需要在文檔中存儲大量關聯對象。
解決思路
- 將大數組分割到其他集合中,主文檔存儲引用。
示例
大文檔超限前:
{ "_id": "project1", "name": "Big Project", "tasks": [ /* 超大量任務數據 */ ] }
優(yōu)化后:
// 主文檔 { "_id": "project1", "name": "Big Project" } // 任務文檔 { "projectId": "project1", "taskId": 1, "taskName": "Task 1", ... }
查詢時通過 projectId
關聯:
db.projects.find({ _id: "project1" }); db.tasks.find({ projectId: "project1" });
4. 壓縮數據
適用場景:文檔中包含重復數據或可壓縮結構(如 JSON 數據)。
解決思路
- 在存儲之前壓縮數據(例如使用 GZIP、Zlib 等)。
- 查詢時解壓數據。
示例
Python 實現:
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. 修改數據結構
適用場景:文檔設計冗余或結構不合理。
解決思路
- 簡化嵌套層級。
- 使用更緊湊的數據類型(如數組代替對象)。
優(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)或其他存儲服務
適用場景:非結構化大數據(如媒體文件、大型JSON)。
解決思路
- 將大數據存儲到文件系統(tǒng)、Amazon S3、Azure Blob 等。
- 在 MongoDB 中存儲文件路徑或 URL。
總結
- 優(yōu)先選擇方案:
- 使用 GridFS 存儲大文件。
- 拆分文檔 或 分表設計 解決超大文檔問題。
- 結合壓縮或外部存儲進一步優(yōu)化。
以上就是MongoDB中單對象大小超16M的存儲方案的詳細內容,更多關于MongoDB單對象大小超16M的資料請關注腳本之家其它相關文章!
相關文章
mongoDB 多重數組查詢(AngularJS綁定顯示 nodejs)
這篇文章主要介紹了mongoDB 多重數組查詢(AngularJS綁定顯示 nodejs),需要的朋友可以參考下2017-06-06MongoDB系列教程(三):Windows中下載和安裝MongoDB
這篇文章主要介紹了MongoDB系列教程(三):MongoDB下載和安裝,本文講解使用Windows環(huán)境安裝MongoDB,需要的朋友可以參考下2015-05-05MongoDB模糊查詢操作案例詳解(類關系型數據庫的 like 和 not like)
這篇文章主要介紹了MongoDB的模糊查詢操作(類關系型數據庫的 like 和 not like) ,本文通過代碼案例分析給大家介紹的非常詳細,具有一定的參考借鑒價值,,需要的朋友可以參考下2019-07-07