MongoDB基礎知識

微服務流行,我也是愈來愈喜歡MongoDB了,除非必要要用MySQL,我都會傾向於MongoDB。sql

MongoDB

什麼是MongoDB ?

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。數據庫

在高負載的狀況下,添加更多的節點,能夠保證服務器性能。編程

MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。數組

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。bash

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。

MongoDB特色

  • MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。
  • 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。
  • 若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操做。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並能夠經過db.runCommand或mapreduce命令來執行MapReduce操做。
  • GridFS是MongoDB中的一個內置功能,能夠用於存放大量小文件。
  • MongoDB容許在服務端執行腳本,能夠用Javascript編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
  • MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  • MongoDB安裝簡單。

MongoDB與其餘數據庫的對比

MongoDB 與 MySQL

因爲MongoDB獨特的數據處理方式,能夠將熱點數據加載到內存,故而對查詢來說,會很是快(固然也會很是消耗內存);同時因爲採用了BSON的方式存儲數據,故而對JSON格式數據具備很是好的支持性以及友好的表結構修改性,文檔式的存儲方式,數據友好可見;數據庫的分片集羣負載具備很是好的擴展性以及很是不錯的自動故障轉移(大讚)。服務器

不足:數據庫的查詢採用了特有的查詢方式,有必定的學習成本(不高);索引不咋滴;鎖只能提供到collection級別,還作不到行級鎖;沒有事務機制(不能回滾啊);學習資料確定沒有MySQL的多。網絡

MongoDB與Hadoop的區別

MongoDB側重於對數據進行操做的應用系統,而Hadoop則側重於對數據進行分析統計的應用。數據結構

MongoDB可以知足對數據庫讀寫性能具備極高要求的應用場景(很消耗memory的),通常這些應用的響應延遲會要求控制在10ms如下,甚至更低。而Hadoop因爲每一次的讀寫操做會包含大量數據(Hadoop更適合少次操做大批量數據的場景),經過彙集分析處理大量數據,這種分析通常都會走MapReduce,會形成很高的延遲(數分鐘到數小時不等)框架

MongoDB與MySQL 1

MongoDB與MySQL 2

MongoDB的優點

MongoDB的不足

MongoDB查詢

查詢語法

db.collection.find(query, projection).pretty()
複製代碼

collection:文檔名稱,或者可寫成 getCollection('col_name')編程語言

query :可選,使用查詢操做符指定查詢條件

projection:可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。

pretty():易讀

條件語法

操做 格式 範例
等於 {<key>:<value>} db.col.find({"by":"菜鳥教程"}).pretty()
小於 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty()
小於或等於 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty()
大於 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty()
大於或等於 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty()
不等於 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty()

AND語法

db.col.find({key1:value1, key2:value2}).pretty()
複製代碼

OR語法

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
複製代碼

AND 與 OR

db.col.find(
	{
		key1: value1, 
		$or: [
			{key2: value2},
			{key3: value3}
		]
	}
).pretty()
複製代碼

limit()

該參數指定從MongoDB中讀取的記錄條數。

db.col.find().limit(NUMBER)
複製代碼

skip()

跳過指定數量的數據

db.col.find().limit(NUMBER).skip(NUMBER)
複製代碼

排序

db.col.find().sort({KEY:1})
複製代碼

聚合

db.col.aggregate(AGGREGATE_OPERATION)
複製代碼

舉例:如今咱們經過以上集合計算每一個做者所寫的文章數,使用aggregate()計算結果以下:

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
複製代碼

與sql相同:

select by_user, count(*) from mycol group by by_user
複製代碼

管道

管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的參數。

MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。

表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。

這裏咱們介紹一下聚合框架中經常使用的幾個操做:

  • $project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
  • match:用於過濾數據,只輸出符合條件的文檔。match使用MongoDB的標準查詢操做。
  • $limit:用來限制MongoDB聚合管道返回的文檔數。
  • $skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
  • $unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
  • $group:將集合中的文檔分組,可用於統計結果。
  • $sort:將輸入文檔排序後輸出。
  • $geoNear:輸出接近某一地理位置的有序文檔。
相關文章
相關標籤/搜索