1. 程式人生 > >MongoDB學習心得

MongoDB學習心得

1.MongoDB簡介

什麼是MongoDB?

MongoDB 是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。

在高負載的情況下,新增更多的節點,可以保證伺服器效能。

MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

MongoDB主要特點

  1. MongoDB的提供了一個面向文件儲存,操作起來比較簡單和容易。
  2. 你可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  3. 你可以通過本地或者網路建立資料映象,這使得MongoDB有更強的擴充套件性。
  4. 如果負載的增加(需要更多的儲存空間和更強的處理能力) ,它可以分佈在計算機網路中的其他節點上這就是所謂的分片。
  5. Mongo支援豐富的查詢表示式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列。
  6. MongoDb 使用update()命令可以實現替換完成的文件(資料)或者一些指定的資料欄位 。
  7. Mongodb中的Map/reduce主要是用來對資料進行批量處理和聚合操作。
  8. Map和Reduce。Map函式呼叫emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函式進行處理。
  9. Map函式和Reduce函式是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
  10. GridFS是MongoDB中的一個內建功能,可以用於存放大量小檔案。
  11. MongoDB允許在服務端執行指令碼,可以用Javascript編寫某個函式,直接在服務端執行,也可以把函式的定義儲存在服務端,下次直接呼叫即可。
  12. MongoDB支援各種程式語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  13. WMongoDB安裝簡單。

MongoDB和傳統資料庫MySQL的區別

關係模型和文件模型的區別在哪裡?

關係模型需要你把一個數據物件,拆分成零部件,然後存到各個相應的表裡,需要的是最後把它拼起來。舉例子來說,假設我們要做一個CRM應用,那麼要管理客戶的基本資訊,包括客戶名字、地址、電話等。由於每個客戶可能有多個電話,那麼按照第三正規化,我們會把電話號碼用單獨的一個表來儲存,並在顯示客戶資訊的時候通過關聯把需要的資訊取回來。

而MongoDB的文件模式,與這個模式大不相同。由於我們的儲存單位是一個文件,可以支援陣列和巢狀文件,所以很多時候你直接用一個這樣的文件就可以涵蓋這個客戶相關的所有個人資訊。關係型資料庫的關聯功能不一定就是它的優勢,而是它能夠工作的必要條件。 而在MongoDB裡面,利用富文件的性質,很多時候,關聯是個偽需求,可以通過合理建模來避免做關聯。

雖然MongoDB的模型和關係型截然不同,但是關係型資料庫的一些必不可少的功能如動態查詢、二級索引、聚合等在MongoDB中也有非常完善的支援。

關係模型和文件模型的區別在哪裡?

關係模型需要你把一個數據物件,拆分成零部件,然後存到各個相應的表裡,需要的是最後把它拼起來。舉例子來說,假設我們要做一個CRM應用,那麼要管理客戶的基本資訊,包括客戶名字、地址、電話等。由於每個客戶可能有多個電話,那麼按照第三正規化,我們會把電話號碼用單獨的一個表來儲存,並在顯示客戶資訊的時候通過關聯把需要的資訊取回來。

而MongoDB的文件模式,與這個模式大不相同。由於我們的儲存單位是一個文件,可以支援陣列和巢狀文件,所以很多時候你直接用一個這樣的文件就可以涵蓋這個客戶相關的所有個人資訊。關係型資料庫的關聯功能不一定就是它的優勢,而是它能夠工作的必要條件。 而在MongoDB裡面,利用富文件的性質,很多時候,關聯是個偽需求,可以通過合理建模來避免做關聯。

雖然MongoDB的模型和關係型截然不同,但是關係型資料庫的一些必不可少的功能如動態查詢、二級索引、聚合等在MongoDB中也有非常完善的支援。

那麼我們如何考慮MongoDB 文件模式設計的基本策略呢?

其實很簡單,我們一般建議的是先考慮內嵌, 直接按照你的物件模型來設計你的資料模型。如果你的物件模型數量不多,關係不是很複雜,那麼恭喜你,可能直接一種物件對應一個集合就可以了。

內嵌是文件模型的特色,可以充分利用MongoDB的富文件功能來享受我們剛才談到的一些文件模型的效能和擴充套件性等特性。一般的一對一、一對多關係,比如說一個人多個地址多個電話等等都可以放在一個文件裡用內嵌來完成。

但是有一些時候,使用引用則難以避免。比如說, 一個明星的部落格可能有幾十萬或者幾百萬的回覆,這個時候如果把comments放到一個數組裡,可能會超出16M的限制。這個時候你可以考慮使用引用的方式,在主表裡儲存一個id值,指向另一個表中的 id 值。使用引用要注意的就是:從效能上講,一般我們可能需要兩次以上才能把需要的資料取回來。更加重要的是:需要把資料存放到兩個集合裡,但是目前為止MongoDB並不支援跨表的事務性,所以對於強事務的應用場景要謹慎使用。

MongoDB的模式設計和關係型大不相同,我們說MongoDB是為應用程式設計的,而不是為了儲存優化的。如果可以達到最高效能的話,我們甚至可以做一些反正規化的東西。

2.MongoDB下載與安裝

LInux系統:

3.MongoDB資料庫基本語句

MongoDB服務啟動:

(centos7):systemctl start/stop mongod.service

MongoDB資料庫連線

mongo 127.0.0.1:27017/admin -u root -p 123456

MOngoDB(3.0之後)建立使用者

db.createUser(
...   {
...     user: "dba",
...     pwd: "dba",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )

MOngoDB(3.0之前)建立使用者

db.addUser(
...   {
...     user: "dba",
...     pwd: "dba",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )

MongoDB建立資料庫

MongoDB不會為了建立資料庫而去寫一條語句執行,db.test.createCollection()

MongoDB常用語句:

1.查詢collection中所有的資料
	db.collection.find(query, projection)
	query:查詢語句(可省略)
	projection:返回的鍵值,如果省略,則返回所有鍵值
2.根據條件查詢
	db.col.find({"by":"菜鳥教程"})
	db.col.find({"likes":{$lt:50}})小於
	db.col.find({"likes":{$lte:50}})小於或等於
	db.col.find({"likes":{$gt:50}})大於
	db.col.find({"likes":{$gte:50}})大於或等於
	db.col.find({"likes":{$ne:50}})不等於
3.AND關鍵字的使用
	db.col.find({"likes":{$lt:50},"by":"菜鳥教程"})
4.OR關鍵字的使用
	db.col.find({
		$or:[
			{key1:value1},{key2:value2}
		]	
	})
5.$type操作符
	獲取title為String型別的資料(數字2代表String)
	db.col.find({"title" : {$type : 2}})

型別	數字	備註
Double	1	 
String	2	 
Object	3	 
Array	4	 
Binary data	5	 
Undefined	6	已廢棄。
Object id	7	 
Boolean	8	 
Date	9	 
Null	10	 
Regular Expression	11	 
JavaScript	13	 
Symbol	14	 
JavaScript (with scope)	15	 
32-bit integer	16	 
Timestamp	17	 
64-bit integer	18	 
Min key	255	Query with -1.
Max key	127	 

6.分頁
	limit(num)查詢num條資料
	skip(num)跳過num條資料