MongoDB是什麼以及它如何滿足您的應用需求

大雄45發表於2021-07-27
導讀 NoSQL資料儲存讓資料管理方式更加靈活,徹底改變了軟體開發的狀況。MongoDB是知名的NoSQL解決方案之一,這是一種面向文件的資料儲存系統。本文探討MongoDB是什麼以及它如何滿足您的應用需求。
MongoDB:文件資料儲存系統

關聯式資料庫將資訊儲存在嚴格監管的表和列中。MongoDB是一種文件儲存系統,將資訊儲存在集合和文件中。這裡的主要區別在於集合和文件是非結構化的,有時稱為無模式。這意味著MongoDB例項(集合和文件)的結構不是預定義的,可靈活適應放入其中的任何資料。

文件是一個鍵值集,其行為與JavaScript等程式碼中的物件非常相似:它的結構根據放入其中的資料而變化。這使得針對MongoDB等資料儲存系統進行程式設計比針對關係資料儲存系統進行程式設計來得更容易、更靈活。簡而言之,應用程式程式碼和文件資料儲存系統之間的互動感覺更自然。

圖1直觀地顯示了MongoDB資料庫、集合和文件的結構。

MongoDB是什麼以及它如何滿足您的應用需求MongoDB是什麼以及它如何滿足您的應用需求

這種型別的資料建模繼承的靈活性意味著可以在更加按需使用的基礎上處理資料,從而實現此處所述的效能優勢。

想具體瞭解這種差異,不妨比較以下兩種實現相同任務(建立記錄,然後從應用程式新增欄位)的方法,先用關聯式資料庫,之後用MongoDB。

關聯式資料庫中的步驟:

# create a database: 
CREATE DATABASE menagerie; 
# create a table in the database:  
USE menagerie; CREATE TABLE pet (name VARCHAR(20)); 
# connect to the database in app and issue insert:  
INSERT INTO pet (name) VALUES ('Friar Tuck'); 
# add a column:  
ALTER TABLE pet ADD type VARCHAR(20)); 
# update existing record:  
UPDATE pet SET type = 'cat' WHERE name = 'Friar Tuck'

現在用MongoDB執行同樣的過程:

# connect to the database in app and issue insert:  
use menagerie; db.pet.insertOne({name:"friar tuck"}); 
# issue update:  
db.pet.updateOne({ name:'friar tuck' }, { $set:{ type: 'cat' } } );

從前面您可以瞭解使用MongoDB的開發體驗有多流暢。

這種靈活性當然將避免模式臃腫的負擔加在了開發人員的身上。駕馭大型應用程式的文件結構至關重要。

MongoDB中的ID欄位

關係型資料庫中有主鍵這個概念,這通常是一個合成ID列(也就是說,與業務資料無關的生成值)。在MongoDB中,每個文件都有一個用途相似的_id欄位。如果開發人員在建立文件時沒有提供 ID,MongoDB引擎將自動生成一個ID(作為 UUID)。

與主鍵一樣,_id 欄位自動索引,而且必須是唯一的。

MongoDB中的索引

MongoDB中的索引其行為類似關聯式資料庫中的索引:它建立有關文件欄位的額外資料,以加快依賴該欄位的查詢。MongoDB使用 B 樹索引。

可以使用如下語法建立索引:

db.pet.createIndex( { name: 1 } )

引數中的整數表示索引是升序(1) 還是降序(-1)。

MongoDB中巢狀文件

MongoDB面向文件結構的一個強大方面是文件可以巢狀。比如說,您可以建立巢狀文件,而不是建立另一個表來儲存寵物文件的地址資訊,結構如程式碼片段1所示。

程式碼片段1. 巢狀文件示例

{ 
  "_id": "5cf0029caff5056591b0ce7d", 
  "name": "Friar Tuck", 
  "address": { 
    "street": "Feline Lane", 
    "city": "Big Sur", 
    "state": "CA", 
    "zip": "93920" 
  }, 
  "type": "cat" 
}
MongoDB中的非規範化

MongoDB等文件儲存系統對連線的支援有限,也沒有外來鍵的概念。兩者都是資料結構動態特性的結果。MongoDB中的資料建模傾向於非規範化,即複製文件中的資料,而不是將資料嚴格儲存在表孤島中。這提高了查詢速度,不過以增加資料一致性維護為代價。

非規範化不是必需的,在使用面向文件的資料庫時更多地是一種傾向。這是由於處理複雜巢狀記錄的能力得到了提高,而不是SQL傾向於將資料規範化到特定的單值列中。

MongoDB查詢語言

MongoDB中的查詢語言面向JSON,就像文件結構一樣。這有助於一種非常強大的表示式語法,甚至可以處理複雜的巢狀文件。

比如說,您可以透過執行db.pet.find({ "type" : "cat" })來查詢收錄所有貓咪的理論資料庫,或使用db.pet.find({ "type" : "cat" , "address.state": "CA" })來查詢加利福尼亞州的所有貓咪。請注意,查詢語言遍歷巢狀的地址文件。

MongoDB更新語法

MongoDB的alter語法也使用類似JSON的格式,其中$set關鍵字表明將更改哪個欄位、更改為什麼值。set物件透過點表示法支援巢狀文件,如代表片段2所示,可以在其中更改名為“Friar Tuck”的那隻貓的郵政編碼。

程式碼片段2. 更新巢狀文件

db.people.update( 
  { 
    "type": "cat", 
    "name": "Friar Tuck" 
  }, 
  { 
     $set: { 
       "address.zip": "86004" 
     } 
  } 
)

可以從程式碼片段2中看到,更新語法與SQL對應語法一樣強大,實際上更強大。

MongoDB雲和部署選項

MongoDB為可擴充套件性和分散式部署而設計。它完全能夠處理大規模工作負載。

MongoDB公司在MongoDB Atlas中提供了多雲資料庫叢集解決方案。MongoDB Atlas就像一個託管資料庫,可以橫跨不同的雲平臺,包括監控和容錯等企業功能。

不難看出MongoDB的重要性,因此AWS的Amazon DocumentDB產品將MongoDB相容性作為主要賣點。微軟的Azure Cosmos DB遵循類似的模式,支援MongoDB API。

MongoDB中的高可用性

MongoDB支援副本集以實現高可用性。核心思想是將資料一次寫入主例項,然後複製到二級儲存以便讀取。在此處()可瞭解有關MongoDB中複製的更多資訊。

結論是,MongoDB是一種領先的 NoSQL 解決方案,兌現了靈活模式資料儲存系統的承諾。可使用面向幾乎各種程式語言的高階驅動程式,您也可以利用眾多部署選項。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2783659/,如需轉載,請註明出處,否則將追究法律責任。

相關文章