MongoDB是一個開源、跨平台的非關聯式資料庫,屬於一種文件導向(Document-oriented database)的資料庫管理系統,也就是 NoSQL 數據庫管理系統(DBMS)。
非關聯式資料庫(NoSQL)的意思是「Not Only SQL」,又稱「文件資料庫」﹔指的是不限定為關聯式資料庫的資料庫管理系統,以混用關聯式資料庫和非關聯式資料庫來達到最佳的儲存效果。NoSQL資料庫由於使用了彈性較高的 JSON 結構,其實可以不需要Schema,也就是沒有Schema架構(因此稱為 "schema-less"或是"Schema-Free")。NoSQL資料庫,可自由定義資料文件(Document)的結構,以及自由新增欄位。NoSQL 資料庫的主要特點是它們可以快速存儲和檢索大量的非結構化或半結構化資料。這使它們非常適合用於需要快速讀寫以及高吞吐量的使用情境,如:即時分析、物聯網(IoT)和大數據應用。
Schema 是「資料庫綱要」,這份綱要定義一組資料的組成結構,包括資料的名稱、屬性、資料型別等。與此同時,schema 也會定義資料之間的關聯性以及其限制。
例子: 定義 To-do List 的schema
const Schema = mongoose.Schema
const todoSchema = new Schema({
name: {
type: String, // 資料型別是字串
required: true, // 代表這是個必填欄位,若未寫 required,表示此欄位非必填。等同於 required: false 的寫法
},
isdone: {
type: Boolean, // 資料型別是布林值
},
})
例子:
todo
資料都有一個叫做 name
的屬性name
屬性和 isDone
屬性:type
- 設定資料型別。required
- 設定必填,也就屬性值不能為空,否則資料庫會拒絕。default
- 設定預設值,也就是在資料生成時,自動帶入的屬性值。Document 是儲存資料的基本單位,每個 Document 都是一個 JSON 格式的資料結構。當使用者將 JSON 文件儲存到 MongoDB 時,系統會將文件以 BSON(Binary JSON)格式儲存。BSON 是 JSON 的二進制表示形式,具有更多資料類型和更快的傳輸速度。在執行查詢時,MongoDB 會檢索相應的 BSON 並將其轉換回 JSON 以供使用者查詢。
一個簡單的 Document 可能如下所示:這個 Document 包括了三個欄位,其中地址是巢狀的 Document。
Collection 是一個包含多個 Document 的容器。Collections 常被用於組織和儲存相關的 Document。例如,一個 Collection 可能包括一間公司所有員工的 Document。每個 Document 紀錄一位員工的詳細資訊。
在操作方面,Collections 提供了許多方法來查詢、插入、更新和刪除 Document。這種設計讓 Collection 非常靈活,能夠適應不同的資料需求和應用場景。
下圖是資料庫、集結和文件之間的關係。MongoDB 內可以有多個資料庫(Database),資料庫中包含多個集結(Collection),集結中則包含多個文件(Document)。
_id 欄位是文件的主鍵(Primary Key),代表文件的唯一值。每個文件都會有一個獨特的 _id 值,用於確保集合內資料的一致性和準確性。
使用者可以在集結中的任何欄位上建立次級索引,次級索引能幫助使用者更快的搜尋 BSON 文件。次級索引允許使用者在不同欄位上進行快速檢索。次級索引在處理巨量資料時尤其重要,因為執行全集結掃描(Collection Scan)的成本非常高。舉例來說,使用者經常需要根據郵件進行查詢,那麼我們就可以在電子郵件地址這個欄位上建立次級索引,這樣就能直接透過電子郵件地址查詢使用者資料。
高效能處理大數據:MongoDB可以處理T級量的資料庫,可將眾多資料庫串聯後,交給大數據,例如:Cloudera等去分析。
MongoDB 採用文件資料庫,將每筆資料以 Document 和 Field 的方式組織資料,它能夠匯總非結構化資料,將它們製作成快速且好看懂的資料目錄。
(三)廣泛支援的程式語言
以下是 MongoDB 支援的各種主流程式語言:
C、C++、C#,Erlang、Haskell、Java、JavaScript、Lisp、fibjs、node.JS、Perl、PHP、Python、Ruby、Scala、Go、Rust。
(四)查詢語言功能強大
支援豐富的查詢語言以支援讀寫操作(CRUD),並支持聚合和其它現代用例,例如:地理搜索、圖形搜索、文本搜索。
(五)提供高可用性架構
MongoDB的複製工具(稱為副本集)有自動故障轉移功能,提供資料的高可用性(High Availability)。
(六)無限制的水平擴充
藉由資料分片(Sharding)功能來達到水平式擴充,提高MongoDB的儲存空間與效能。
(七)新增欄位自由靈活
MongoDB擁有非常彈性的Schema,不需事先創建表格,數據可直接寫入並自由添加欄位。
ODM 是針對文件資料庫 (document database) 使用的一種叫「物件映射 (object mapping)」 的技術,主要是讓開發者可以直接使用物件導向的方式操作資料庫,同時也增加程式碼的易讀性與維護性。
Mongoose 是提供給 Node.js 使用的 MongoDB ODM。透過 Mongoose,我們可以用物件導向語法,以更直覺的方式操作 MongoDB 資料庫。
彈性的資料結構、分散式水平擴充能力及高可用性、跨區域部署之三大特點兼具 SQL 與 NoSQL 的優點,讓企業用戶在大量或非結構化資料的儲存與管理,如圖檔管理、內容管理、Log 管理、客戶資料管理(貼標) 等情境下,有效提升系統效率並降低 RDBMS 授權成本。