MongoDB原理

目錄

一、概念

二、架構

2.1 邏輯結構

2.2 數據模型

2.3 存儲引擎:WiredTiger?

三、事務


一、概念

?MongoDB是文檔數據庫,基本存儲單元是?文檔(Document),以BSON格式(一種類json的二進制形式)存儲,文檔可以包含鍵值對、嵌套文檔、數組等復雜結構,字段可以動態擴展,需要在代碼層管理數據約束,適合存儲非結構化數據或半結構化數據(如日志、IoT 傳感器數據、實時分析)。

文檔結構示例:

{"_id": ObjectId("507f191e810c19729de860ea"), // MongoDB 自動生成的唯一主鍵"name": "Alice Smith","age": 30,"email": "alice@example.com","address": {"street": "123 Main St","city": "Anytown","zip": "12345"},"hobbies": ["reading", "hiking", "photography"],"created_at": ISODate("2023-10-27T10:00:00Z")
}

設計目標:是解決關系型數據庫在處理海量數據、高并發、靈活數據結構時遇到的擴展性、性能瓶頸和模式僵化問題。

MongoDB與關系型數據庫RDBMS對比:

文檔 (Document):?數據存儲和操作的基本單元,類似于 JSON 對象,結構是鍵值對。

集合 (Collection):一組相關文檔的容器,同一個集合(Collection)中的文檔不要求具有相同的結構(模式自由/動態模式)。字段可以動態添加、修改或刪除。

數據庫 (Database):包含多個集合的物理容器,用于邏輯上隔離不同的應用或數據集,每個數據庫有自己的用戶、權限、集合和索引。

?MongoDB中Document中可以出現的數據類型:

二、架構

2.1 邏輯結構

MongoDB與MySQL架構相差不多,底層都使?了可插拔的存儲引擎以滿用戶的不同需要。最新版本的 MongoDB 中使用了 WiredTiger 作為默認的存儲引擎,WiredTiger 提供了不同粒度的并發控制和壓縮機制,能夠為不同種類的應用提供了最好的性能和存儲率。

在存儲引擎上層的就是 MongoDB 的數據模型和查詢語言了,由于 MongoDB 對數據的存儲與 RDBMS 有較大的差異,所以它創建了一套不同的數據模型和查詢語言。

2.2 數據模型

MongoDB的數據模型有兩種

1> 內嵌:把相關聯的數據保存在同一個文檔結構中

  • 適用場景:一對一或一對少關系,高頻查詢的子數據。

  • 示例:用戶檔案中直接嵌套地址信息

{"user_id": 1001,"profile": {"birthdate": "1990-05-15","education": "碩士"}
}
  • 優點:單次查詢獲取全部數據,讀寫高效。

  • 缺點:文檔大小可能膨脹(上限 16MB)。

2> 引用:通過存儲數據引用信息來實現兩個不同文檔之間的關聯

  • 適用場景:一對多或多對多關系,子數據獨立更新頻繁。

  • 示例:用戶與訂單通過?_id?關聯

// users 集合
{ "_id": ObjectId("662a1b87c1b6e32a50f1a9e2"), "name": "張三","email": "zhangsan@example.com"
}// orders 集合
{ "_id": ObjectId("55f14312c7447c3da7051b27"),"user_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),  // 引用用戶ID"items": ["手機", "耳機"],"total": 5999
}
// 關聯查詢:獲取所有訂單及其對應的用戶信息
db.orders.aggregate([{$lookup: {from: "users",          // 關聯的集合名localField: "user_id",  // 當前集合的關聯字段foreignField: "_id",    // 目標集合的關聯字段as: "user_info"         // 輸出字段名(數組)}}
])// 輸出結果
{"_id": ObjectId("55f14312c7447c3da7051b27"),"user_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),"items": ["手機", "耳機"],"total": 5999,"user_info": [  // 注意:結果總是數組{"_id": ObjectId("662a1b87c1b6e32a50f1a9e2"),"name": "張三","email": "zhangsan@example.com"}]
}
  • 優點:數據冗余少,易于維護一致性。

  • 缺點:需多次查詢($lookup?聚合操作可緩解)。

2.3 存儲引擎:WiredTiger?

存儲引擎負責管理如何在磁盤上存儲數據、處理讀寫操作、實現事務、管理內存緩存等。

MongoDB支持的存儲引擎有MMAPv1,WiredTiger和InMemory。InMemory存儲引擎用于將數據只存儲在內存中,只將少量的元數據(meta-data)和診斷日志(Diagnostic)存儲到硬盤文件中,由于不需要Disk的IO操作,就能獲取所需的數據,InMemory存儲引擎大幅度降低了數據查詢的延遲(Latency)。從mongodb3.2開始默認的存儲引擎是WiredTiger,3.2版本之前的默認存儲引擎是MMAPv1,mongodb4.x版本不再支持MMAPv1存儲引擎。

核心原理:

  • 文檔級并發控制:?這是 WiredTiger 高性能的關鍵。它允許對集合中的不同文檔進行并發讀寫操作(寫操作在文檔級別加鎖),極大地提高了多核CPU環境下的吞吐量。相比之前的 MMAPv1 引擎(集合級鎖),這是質的飛躍。

  • 寫操作流程

    • 數據寫入?Journal 預寫日志(防崩潰)

    • 更新內存中的?Cache

    • 后臺線程異步刷盤:

      • 每 60 秒生成?Checkpoint

      • 壓縮后寫入數據文件

  • 寫優化與持久性:

    • Write Ahead Logging (WAL):?所有寫操作首先被順序、快速地寫入一個持久化的?Journal?文件(并默認寫入Cache)。這確保了即使發生崩潰,也能根據 Journal 恢復未刷盤的數據,保證操作的持久性(Durability)。

    • 內存管理:?使用緩存(Cache)?來存儲頻繁訪問的數據和索引(通過 LRU 算法管理)。寫操作先在內存的 Cache 中進行修改,然后異步寫入 Journal 和最終刷入數據文件。讀操作優先從 Cache 讀取。

    • Checkpoints:?WiredTiger 定期(默認 60 秒或 Journal 達到 2GB)將內存中修改過的數據(臟頁)以一致的狀態快照寫入數據文件。Checkpoint 是數據的持久化點,縮短了崩潰恢復時需要從 Journal 重放的操作量。

  • 壓縮:?WiredTiger 支持對數據(Snappy 或 Zlib)和索引(Prefix)進行壓縮,顯著節省磁盤空間并減少 I/O。

  • B-Tree 索引存儲:?WiredTiger 使用 B-Tree 數據結構存儲索引(這是 MongoDB 索引的主要實現方式)。

  • WiredTiger?關鍵配置?(mongod.conf)

storage:engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 10                  # 內存緩存大小 (建議為物理內存50%)journalCompressor: snappy         # 日志壓縮算法collectionConfig:blockCompressor: zstd             # 數據壓縮算法 (zstd平衡性能/壓縮比)indexConfig:prefixCompression: true           # 索引前綴壓縮

三、事務

  • 支持范圍:?MongoDB 4.0+ 支持多文檔事務(ACID),適用于副本集;MongoDB 4.2+ 支持分布式事務(跨分片事務)。

  • 實現原理:

    • 使用快照隔離 (Snapshot Isolation)?級別。事務看到的是事務開始時數據庫的一致性快照。

    • 在 WiredTiger 存儲引擎中,事務通過 MVCC (多版本并發控制) 實現。寫操作在事務提交前對其他事務不可見。

    • 涉及跨分片事務時,由協調者(通常是發起事務的 Mongos 或 Mongod)使用?Two-Phase Commit (2PC)?協議協調所有參與分片。

  • 注意事項:?雖然提供了 ACID 保證,但分布式事務比單文檔操作開銷大得多,應謹慎使用,避免長時間運行的事務。單文檔操作天生具有原子性。

舉例

const session = db.getMongo().startSession();  // 1. 創建會話
session.startTransaction({                     // 2. 啟動事務readConcern: { level: "snapshot" },writeConcern: { w: "majority" }
});
try {const coll = session.getDatabase("test").users;coll.updateOne({ name: "Alice" }, { $inc: { balance: -100 } }); // 3. 操作1coll.updateOne({ name: "Bob" }, { $inc: { balance: 100 } });    // 4. 操作2session.commitTransaction();               // 5. 提交事務
} catch (error) {session.abortTransaction();                // 6. 出錯回滾
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911844.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《解碼音頻:從基礎到未來的聽覺探索》

音頻:開啟聲音世界的大門 在生活的每一個角落,音頻如影隨形,編織出豐富多彩的聽覺體驗。清晨,第一縷陽光尚未完全照進房間,手機里溫柔的鬧鐘鈴聲,將我們從睡夢中輕輕喚醒,開啟活力滿滿的一天。通…

web安全之h2注入系統學習

起初是在N1 Junior 2025 上面碰到一題,考點是h2的sql注入。由于之前沒有見過,趁此機會系統學習一番 實驗代碼 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS認證系列:考點解析 - cloud trail,cloud watch,aws config

🎯一句話總覽: 服務名類比/角色主要功能CloudTrail監控攝像頭錄像回放記錄“誰在什么時候做了什么操作”CloudWatch護士測體溫 護士喊醫生實時監控系統狀態,并能報警/自動應對AWS Config保安巡邏 記錄資產變更歷史記錄 AWS 資源的“配置狀…

Java八股文——數據結構「數據結構篇」

了解哪些數據結構? 面試官您好,我了解并使用過多種數據結構。在我的理解中,數據結構可以分為幾個大的類別,每一類都有其獨特的優勢和適用場景。 1. 線性結構 (Linear Structures) 這類結構的特點是數據元素之間存在一對一的線性…

C#測試調用EPPlus根據批注設置excel單元格內容

EPPlus也是常用的Excel文件操作庫,但不同于ClosedXML,使用EPPlus前需要設置授權信息,商業應用需要設置商業授權,個人使用或非商業應用也需要設置授權(測試的時候只需設置全名,保存excel文件時會保存到文件詳…

windows本地搭建skywalking, 線程池中traceId不丟失

1.從官網下載9.0.0版本 Downloads | Apache SkyWalking 其它歷史版本的 下載地址 Index of /dist/skywalking 這個頁面 可以下載 apm服務: apache-skywalking-apm-9.0.0.tar.gz agent的包: apache-skywalking-java-agent-9.0.0.tgz 2.解壓后, (看情況去config路徑下 appli…

多模態大語言模型arxiv論文略讀(135)

Agent S: An Open Agentic Framework that Uses Computers Like a Human ?? 論文標題:Agent S: An Open Agentic Framework that Uses Computers Like a Human ?? 論文作者:Saaket Agashe, Jiuzhou Han, Shuyu Gan, Jiachen Yang, Ang Li, Xin Eric…

wpa_supplicant連接到了路由,但是 udhcpc會分配到不同網段的ip,路由器ip為192.168.0網段,板子分配ip為192.168.1的網段

wpa_supplicant連接到了路由,但是 udhcpc會分配到不同網段的ip,路由器ip為192.168.0網段,板子分配ip為192.168.1的網段 你提到的情況: 使用 wpa_supplicant 成功連接到路由器; 然后通過 udhcpc(DHCP客戶端&#xff09…

[Hestia]開源網絡服務器控制面板,快速、可靠、開源

測評介紹 本期測評試用一下Hestia這款面板。Hestia是一個由國際社區支持開發的開源項目,2019年正式發布,目前已積累1.1萬余次代碼提交,幾乎每周都有十多次的代碼提交,更新熱度很高。僅支持比較新的debian和ubuntu,對于…

Windows 安裝 Redis8.0.2

1.下載 Releases redis-windows/redis-windowshttps://github.com/redis-windows/redis-windows/releases 下載后直接解壓到想要的安裝目錄就行了,啟動Redis直接雙擊 redis-server.exe 文件就行了,Redis啟動后雙擊 redis-cli.exe 就可以直接連接到Redi…

GitHub中openmmlab和Detectron2的區別

MMDetection 和 Detectron2 都是計算機視覺領域中流行的開源目標檢測框架,它們有許多相似之處,但也存在一些關鍵差異。以下是兩者的主要區別: 1. 開發團隊與社區 MMDetection 由中國開源組織 OpenMMLab 開發維護,社區以中文用戶為…

開疆智能CCLinkIE轉ModbusTCP網關連接施耐德TCP從站配置案例

本案例是三菱PLC通過CCLinkIE轉ModbusTCP網關連接施耐德Modicon M262 Logic/Motion Controller的配置案例 配置方法: 首先設置Modicon M262 Logic/Motion Controller Modbus TCP 從站設備 I/O 映射選項卡 I/O 以如下方式從主站視角映射到 Modbus 寄存器&#xff1…

【源碼】Reactive 源碼

前言 用了很長時間的 componsition-api 了,最近想看看源碼,抱著單純的學習心態先從 reactive 開始吧。 個人習慣: 看代碼要帶著問題去看,不要盲目的去看問題就是這次看源碼的主線,要圍繞著主線去展開,過…

銀河麒麟 | ubuntu 安裝國產達夢DM8數據庫(安裝+外網通+IDEA連接)

目錄 官網下載安裝 下載安裝包 創建安裝用戶組dinstall 創建安裝用戶dmdba并指定組 創建DM8軟件安裝目錄修改權限 檢查、修改系統資源限制 解壓.zip的壓縮包 安裝mount數據庫 圖形化安裝 清除之前的掛載 開啟Disql服務 修改dmdba的環境變量 檢查狀態 進入數據庫 …

MySQL與Oracle視圖:深入解析與全面對比

視圖概念 視圖在 MySQL 與Oracle中本質上是一種虛擬表,其數據并非實際存儲,而是基于一個或多個基礎表的查詢結果動態生成。它像是對復雜查詢的一種封裝,極大地簡化了數據的查詢操作。例如,當我們需要頻繁從多個關聯表中獲取特定數…

uniapp通過webview套h5時使用plus調取藍牙/usb打印

安卓使用usb調取打印機 /*** 安卓usb調取打印機*param { string | bytes[] } html 傳入的打印內容*傳入一段文本或一個bytes數組* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

吃透 Golang 基礎:基于共享變量的并發

文章目錄 sync.Mutex 互斥鎖sync.RWMutex 讀寫鎖sync.Once 惰性初始化Goroutine 與線程動態棧Goroutine 調度GOMAXPROCSGoroutine 沒有 ID 號 上一篇文章當中我們已經系統性地回顧了在 Go 當中基于 Goroutine 和 Channel 進行并發控制的方法,Goroutine 指的是 Golan…

智紳科技丨如何選擇一家好的養老機構?

居家養老、社區養老和機構養老是我們在養老相關消息中常常聽到的3個詞。在地方文件中,居家養老和社區養老還經常被統稱為居家社區養老或 社區居家養老。那么,這三者之間到底有什么不同呢? 居家養老服務涵蓋生活照料、家政服務、康復護理、醫…

【支持向量機】SVM線性支持向量機學習算法——軟間隔最大化支持向量機

支特向量機(support vector machines, SVM)是一種二類分類模型。它的基本模型是定義在特征空間上的間隔最大的線性分類器。包含線性可分支持向量機、 線性支持向量機、非線性支持向量機。 當訓練數據近似線性可分時,通過軟間隔最大化學習線性分類器, 即為…

面試 — 預準備 — 面試前準備攻略

好記憶不如爛筆頭,能記下點東西,就記下點,有時間拿出來看看,也會發覺不一樣的感受. 只講干貨,不羅里吧嗦! 作為一個軟件從業者,在面試前的準備工作至關重要,能大幅提升你的求職成功…