為何現代App都愛用?MongoDB教學帶你揭開NoSQL的效能秘密

為何現代App都愛用?MongoDB教學帶你揭開NoSQL的效能秘密

在現代應用程式開發的浪潮中,巨量資料以驚人的速度增長,資料的樣貌也變得日益複雜多變。傳統的關聯式資料庫(如 MySQL)在應對這些挑戰時,有時會顯得力不從心。正是在這樣的背景下,以 MongoDB 為首的 NoSQL 資料庫管理系統應運而生,並迅速成為開發者社群的寵兒。MongoDB 是一個 open source、高效能、具備可擴展性的「文件資料庫」,專為提升開發效率與應對大規模資料而設計。

無論您是剛踏入後端開發領域的新手,還是希望擴展技術視野的資深工程師,理解並掌握 MongoDB 都將為您的技能樹增添極具價值的一筆。本文將作為您的全方位指南,從 MongoDB 的核心概念與優勢出發,深入淺出地比較它與傳統 SQL 資料庫的差異,並提供在 Windows 和 macOS 雙平台上鉅細靡遺的安裝設定教學。最後,我們將帶您實際操作,學習最核心的資料庫增刪改查指令,為您打下堅實的 MongoDB 基礎。

MongoDB 核心概念解析

在動手安裝之前,我們必須先徹底理解 mongodb是什麼、其運作哲學與其與眾不同之處。

什麼是 MongoDB?

MongoDB 是一個 NoSQL(非關聯式)資料庫,更精確地說,它屬於「文件導向資料庫(Document-Oriented Database)」。這意味著它儲存資料的基本單位不是傳統資料庫的「行(Row)」,而是一個個結構靈活、類似 JSON 格式的「文件(Document)」。

這種設計哲學源於「Not Only SQL」的概念,旨在提供比傳統的關聯式資料庫nosql更具彈性的資料模型,特別適合處理大量、非結構化資料或半結構化的資料。

MongoDB vs. 傳統關聯式資料庫 (RDBMS)

對於熟悉 MySQL、PostgreSQL 等關聯式資料庫的開發者來說,理解 MongoDB 的第一步就是對比它們之間的術語和核心差異。

關聯式資料庫 (RDBMS) 術語 MongoDB 術語 說明
Database Database 資料庫,最高層級的容器,概念相同。
Table Collection 集合,相當於資料表,但它不強制固定的結構。
Row / Tuple Document 文件,相當於一筆資料紀錄,以 BSON 格式儲存。
Column / Field Field 欄位,文件內的鍵值對 (Key-Value Pair) 中的「鍵」。
Table Join Embedded Documents / Lookup 文件內嵌或 $lookup 操作,用來處理關聯資料。
Primary Key _id 主鍵,每個文件都必須有的唯一識別符。

核心差異:彈性結構 (Schema-Free) vs. 固定結構 (Fixed Schema)

兩者最大的分野在於對「結構(Schema)」的要求。

RDBMS (如 MySQL):在寫入資料前,必須先嚴格定義資料表(Table)的結構,包含所有欄位(Column)的名稱與資料類型。如果要新增一個欄位,就必須修改整個資料表的結構,過程相對繁瑣。

  • 例子:假設 users 資料表有 name 和 email 兩個欄位。若想為某一位使用者新增「嗜好(hobby)」欄位,就必須先修改 users 表的結構,為所有使用者都加上 hobby 欄位,即使其他使用者的該欄位是空的。

MongoDB:它的 Collection 不需要預先定義結構。每個 Document 都可以有自己獨特的欄位組合,能做到自由新增欄位。這種特性被稱為「Schema-Less」或「彈性結構」。

  • 例子:在 users 使用者資料集合中,一個文件可以只有 name 和 email,而另一個文件可以同時包含 name、email 和 hobbies(一個儲存多個嗜好的陣列)。這種靈活性極大地加速了開發迭代速度,特別適合需求快速變動的新創專案。

MongoDB 的資料層級架構

MongoDB 的資料組織方式非常直觀,由大到小分為三個層級:

Document (文件)

這是 MongoDB 中每筆資料儲存的最基本單元。它由一系列的鍵值對(Field-Value Pair)組成,json結構看起來非常像程式語言中的 json文件。實際上,MongoDB 在底層儲存時,使用的是一種稱為 BSON(Binary JSON) 的格式。

BSON 的優勢

  • 更快的傳輸與解析速度:二進位格式比純文字的 JSON 更緊湊,處理速度更快。
  • 支援更多資料型別:除了 JSON 原有的 String, Number, Boolean, Array, Object 外,BSON 還支援如 ObjectId(常用作主鍵)、Date、Timestamp、NumberLong(64位元整數)等更豐富的型別。

Collection (集合)

集合是一組文件的容器,可以理解為關聯式資料庫中的「資料表」。但如前述,集合中的文件不需要擁有完全相同的結構。通常,我們會將同一類型或相關的資料放在同一個集合中,例如 users 集合、products 集合,以確保集合內資料的一致性與關聯性。

Database (資料庫)

資料庫是集合的實體容器。一個 MongoDB 伺服器可以運行多個資料庫,每個資料庫都有自己獨立的權限,可以將不同的應用程式資料存放在不同的資料庫中,以實現隔離。

MongoDB 的主要優勢

  • 高靈活性:彈性的 Schema 讓資料模型可以隨著業務需求輕鬆演進,無需進行複雜的資料庫遷移。開發者可以定義資料文件的資料格式,而不用被嚴格的綱要定義所限制。
  • 高可擴展性:MongoDB 天生支援「水平擴展(Horizontal Scaling)」。透過其「分片(Sharding)」功能,可以將一個龐大的集合分散到多台伺服器上資料儲存和處理,從而突破單一伺服器的儲存空間與效能瓶頸,這也是其水平擴展性體現。
  • 高可用性:透過「副本集(Replica Set)」架構,可以將資料複製多份到不同的伺服器。當主伺服器(Primary)發生故障時,其自動轉移功能會在幾秒內從次要伺服器(Secondary)中選舉出新的主伺服器接管工作,實現服務近乎零中斷。
  • 高效能與豐富的查詢功能:將關聯資料內嵌(Embed)在單一文件中,可以大幅減少需要「連接(Join)」的操作,從而提升查詢效能。同時,MongoDB 提供了強大的查詢語言功能(MQL),支援索引、聚合(Aggregation)、地理空間查詢等進階功能,能有效處理大數據。

安裝與環境設定

接下來,我們將分別介紹在 Windows 和 macOS 系統上安裝 MongoDB 的詳細步驟,讓您順利建置這個強大的資料庫系統。

在 Windows 上安裝 MongoDB

我們推薦將 MongoDB 設定為系統服務,這樣電腦開機後就會自動在背景執行,無需每次手動啟動。

下載 MongoDB Community Server

前往 MongoDB 官網的 Community Server 下載中心,選擇最新版本的 MSI 安裝檔。

執行安裝程式

  • 雙擊 msi 檔案,依照提示進行安裝。
  • 在選擇安裝類型時,建議選擇「Complete (完整)」安裝。這會同時安裝 MongoDB 伺服器以及圖形化管理工具 MongoDB Compass
  • 在「Install MongoDB as a Service」的選項頁面,務必勾選此項。
    • Service Name: 保持預設的 MongoDB 即可。
    • Data Directory: 預設會將資料庫檔案存放在 C:\Program Files\MongoDB\Server\[版本號]\data。這就是存放 data db 的位置。
    • Log Directory: 預設會將日誌檔案存放在 C:\Program Files\MongoDB\Server\[版本號]\log。
  • 完成安裝後,安裝程式會自動幫您設定好服務並啟動。

設定環境變數(強烈建議)

為了能在任何路徑下執行 MongoDB 的指令,我們需要將其執行檔資料夾加入到系統的環境變數中。

  • 找到 MongoDB 的安裝路徑,通常是 C:\Program Files\MongoDB\Server\[版本號]\bin。複製此路徑。
  • 在系統搜尋中輸入「編輯系統環境變數」並開啟。
  • 點擊「環境變數…」。
  • 在「系統變數」區塊找到並點選「Path」,然後點擊「編輯」。
  • 點擊「新增」,並將剛剛複製的 bin 目錄路徑貼上,然後一路按「確定」儲存。

驗證安裝

  • 開啟一個新的命令提示字元 (cmd) 或 PowerShell 視窗。
  • 輸入 mongosh –version。如果成功顯示版本號,代表環境變數已設定成功。
  • 輸入 mongosh,如果成功進入 > 提示符,代表您已成功連接到在本機運行的 MongoDB 伺服器。

在 macOS 上安裝 MongoDB

在 macOS 上,使用mongodb並透過 Homebrew 管理是最推薦、最便捷的方式。

安裝 Homebrew

如果您的電腦尚未安裝 Homebrew,請開啟「終端機(Terminal)」並執行以下指令:

bash /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

使用 Homebrew 安裝 MongoDB

  • 首先,加入 MongoDB 的官方 Homebrew tap(一個公式倉庫):
    brew tap mongodb/brew
  • 接著,安裝 MongoDB Community Edition:
    brew install mongodb-community

這個指令會安裝 MongoDB 伺服器 (mongod) 以及新版的命令列工具 mongosh。

啟動 MongoDB 服務

Homebrew Services 讓我們可以輕鬆地將 MongoDB 作為背景服務來管理。

  • 啟動服務
    brew services start mongodb-community
    執行後,MongoDB 就會在背景持續運行,即使重開機也會自動啟動。
  • 驗證服務狀態
    brew services list
    您應該會看到 mongodb-community 的狀態是 started。
  • 停止服務
    brew services stop mongodb-community

驗證安裝

開啟一個新的終端機視窗,輸入 mongosh。如果成功進入 > 提示符,代表安裝與服務啟動皆已成功。

MongoDB 基本操作實戰

成功安裝並啟動 MongoDB 後,我們就可以透過 mongosh 這個強大的互動式 Shell 來對文檔資料庫進行操作了。CRUD 是所有資料庫操作的基礎,分別代表:Create (新增)、Read (讀取)、Update (更新)、Delete (刪除)。

連接到 MongoDB Shell

打開您的終端機或命令提示字元,輸入 mongosh 並按下 Enter,即可進入操作環境。

基礎指令

  • show dbs 或 show databases:顯示目前伺服器上所有的資料庫。
  • use <database_name>:切換到指定的資料庫。如果該資料庫不存在,MongoDB 會在您第一次向其中寫入資料時自動創建它。
  • db:顯示目前所在的資料庫。
  • show collections:顯示目前資料庫中所有的集合。

實戰 CRUD 操作

讓我們以一個 bookstore 資料庫和一個 books 集合為例,其中 mongodb data 會被儲存在對應的資料夾。

1. Create (新增資料)

首先,切換到我們的資料庫:

use bookstore
  • 新增單一文件:insertOne()javascript db.books.insertOne({ title: “The Three-Body Problem”, author: “Cixin Liu”, year_published: 2008, genres: [“Science Fiction”], stock: 15 })

    成功後,會返回一個包含 acknowledged: true 和新文件 _id 的物件。

  • 新增多個文件:insertMany()javascript db.books.insertMany([ { title: “Dune”, author: “Frank Herbert”, year_published: 1965, genres: [“Science Fiction”, “Adventure”], stock: 10 }, { title: “1984”, author: “George Orwell”, year_published: 1949, genres: [“Dystopian”, “Political Fiction”], stock: 25 } ])

2. Read (查詢資料)

  • 查詢所有文件:find()javascript db.books.find()

    這會返回 books 集合中的所有文件。若想以更美觀的格式顯示,可以加上 .pretty()。

  • 根據條件查詢:find({ query })
    查詢作者是 “George Orwell” 的書,其name屬性為指定值:javascript db.books.find({ author: “George Orwell” })

    查詢庫存大於 20 本的書($gt 代表 “greater than”):

    javascript db.books.find({ stock: { $gt: 20 } })

  • 查詢單一文件:findOne()
    findOne 只會返回符合條件的第一個文件,這在您確定只有一筆結果或只關心第一筆結果時非常有用。javascript db.books.findOne({ title: “Dune” })

3. Update (更新資料)

  • 更新單一文件:updateOne()
    將 “Dune” 的庫存更新為 12。第一個物件是查詢條件,第二個物件是更新操作。$set 運算子用來指定要修改的欄位。javascript db.books.updateOne( { title: “Dune” }, { $set: { stock: 12 } } )
  • 更新多個文件:updateMany()
    將所有科幻小說(Science Fiction)的庫存都減少 1($inc 運算子用於增減數值)。javascript db.books.updateMany( { genres: “Science Fiction” }, { $inc: { stock: -1 } } )

4. Delete (刪除資料)

  • 刪除單一文件:deleteOne()
    刪除書名為 “1984” 的書。javascript db.books.deleteOne({ title: “1984” })
  • 刪除多個文件:deleteMany()
    刪除所有庫存為 0 的書。javascript db.books.deleteMany({ stock: 0 })

常見問題 (FAQ)

Q1: MongoDB 真的完全不需要 Schema 嗎?

A: 這個說法既對也不對。從資料庫層面來看,MongoDB 本身不強制執行 Schema,這給予了開發極大的靈活性,稱之為「Schema-on-Read」。但在實際的、嚴謹的應用程式開發中,為了確保資料的一致性和可維護性,通常會在應用程式層面定義和驗證資料結構。例如,在使用 Node.js 開發時,開發者常會使用像 Mongoose 這樣的 mongodb odm (Object Data Modeling) 函式庫來定義模型(Schema),從而在寫入資料庫前進行驗證,實現「Schema-on-Write」。

Q2: 我應該選擇 MongoDB 還是像 MySQL 這樣的 SQL 資料庫?

A: 這是個經典問題,答案取決於您的應用場景與對安全性要求:

  • 選擇 SQL 資料庫 (如 MySQL):當您的應用需要高度的交易一致性(ACID)、資料組成結構穩定且關係複雜(需要大量 Join 操作)時,例如金融交易系統、企業資源規劃(ERP)系統。
  • 選擇 MongoDB:當您的資料結構需要頻繁變動、資料量巨大需要水平擴展、或處理大量非結構化/半結構化資料時,例如物聯網(IoT)資料收集、內容管理系統(CMS)、社交媒體平台的網站、即時分析應用。

Q3: 什麼是 _id 欄位?我可以自己設定它的值嗎?

A: id 是每個 MongoDB 文件中的強制性主鍵,其值在集合內必須是唯一的。如果您在插入文件時沒有手動提供 id 的值,MongoDB 會自動生成一個 12 位元組的 BSON ObjectId 作為其值。您可以手動設定 _id 的值,只要確保該值(可以是任何 BSON 型別,只要不重複)在集合內是唯一的即可。

Q4: 為什麼我手動啟動 MongoDB 伺服器後,終端機視窗就卡住了,無法輸入新指令?

A: 當您直接在終端機執行 mongod 指令時,它會在前台運行,並將伺服器的日誌訊息持續輸出到該視窗,因此您無法再輸入其他指令。正確的做法是:

  1. 推薦方式:將 MongoDB 作為背景服務運行(如上文教學中的 brew services start 或 Windows 服務)。
  2. 臨時方式:保持該終端機視窗運行,然後另外開啟一個新的終端機視窗,在新視窗中輸入 mongosh 來連接到正在運行的伺服器。

總結

恭喜您!至此,您已經完成了從理解 MongoDB 核心概念、在不同作業系統上成功安裝與配置,到親手實踐最基本的document database操作的全過程。

我們了解到,MongoDB 憑藉其彈性的文件模型、強大的水平擴展能力和高可用性架構,成為了現代應用程式開發的利器。它讓開發者能夠從僵化的資料結構中解放出來,更快速地應對業務變化。本文涵蓋的 CRUD 指令是您與 MongoDB 互動的基石,熟練掌握它們是進一步學習的必要條件。

當然,MongoDB 的世界遠不止於此。更進階的主題,如複雜的聚合管道(Aggregation Pipeline)、高效的索引策略、副本集與分片的深入配置等,都是您在未來可以持續探索的方向。希望本篇教學能為您的 MongoDB 學習之旅奠定一個穩固的起點。

資料來源

返回頂端