天天看點

MongoDB資料庫總結

什麼是MongoDB ?

 MongoDB是基于文檔的存儲的(而非表),是一個介于關系資料庫和非關系資料庫之間的産品,是非關系資料庫當中功能最豐富,最像關系資料庫的。 他支援的資料結構非常松散,是類似json的bjson格式,是以可以存儲比較複雜的資料類型。模式自由(schema-free),意味着對于存儲在MongoDB資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案存儲在同一個資料庫裡。 Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似于面向對象的查詢語言,幾乎可以實作類似關系資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

MongoDB的安裝 MongoDB的特點 MongoDB應用案例有哪些?

MongoDB安裝:

MongoDB資料庫總結

MongDB的配置可以參考這個: http://blog.csdn.net/fdipzone/article/details/7442162

MongoDB資料庫的特點:

1.  MongoDB是一個獨立的伺服器。 如MySQL或PostreSQL 一樣,MongoDB提供偵聽端口以便接入。它提供了用于查詢,建立,更新和删除的工具。從理論上講,你使用它的工作方式相同:連接配接,執行任務并關閉連接配接。

2.它是基于文檔的,而不是基于表格的。MongoDB 将資料存儲為一個文檔,資料結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。

3.它是非結構化的。MongoDB沒有很多查詢語句。在大多數情況下,隻需給它一個數組指定你想要的資訊,然後它會給你傳回文檔的數組。如果你想運作一些非常複雜的查詢(如Map-Reduce操作),可以向MongoDB傳遞JavaScript,其内部的JavaScript引擎可以解析這個腳本。

4.高性能、易部署、易使用,存儲資料非常友善。

5. 支援完全索引,包含内部對象。

6.它具有強大的主流開發語言支援,如C#、C++、Java、PHP、Perl、Python、Ruby。

MongoDB适用場景?

1、京東,中國著名電商,使用MongoDB存儲商品資訊,支援比價和關注功能.  

2、趕集網,中國著名分類資訊網站,使用MongoDB記錄pv浏覽計數

 3、奇虎360,著名病毒軟體防護和移動應用平台,使用MongoBD支撐的HULK平台每天接受200億次的查詢.

 4、百度雲,使用MongoDB管理百度雲盤中500億條關于檔案源資訊的記錄.

5、CERN,著名的粒子實體研究所,歐洲核子研究中心大型強子對撞機的資料使用MongoDB

6、紐約時報,領先的線上新聞門戶網站之一,使用MongoDB

 7、sourceforge.net,資源網站查找,建立和釋出開源軟體免費,使用MongoDB的後端存儲。

關系型資料庫和非關系型資料庫差別?

關系型資料庫,是指采用了關系模型來組織資料的資料庫。 關系模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在之後的幾十年中,關系模型的概念得到了充分的發展并逐漸成為主流資料庫結構的主流模型。 簡單來說,關系模型指的就是二維表格模型,而一個關系型資料庫就是由二維表及其之間的聯系所組成的一個資料組織。 常用關系型資料庫有Oracle、SQLServer、Sybase、Informix、access、DB2、mysql等 非關系型資料庫有 MongoDB、CouchDB、 Tokoy Tyrant、Voldemort等

關系型資料庫優點

容易了解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易了解     使用友善:通用的SQL語言使得操作關系型資料庫非常友善     易于維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料備援和資料不一緻的機率

關系型資料庫瓶頸

高并發讀寫需求    

 網站的使用者并發性非常高,往往達到每秒上萬次讀寫請求, 對于傳統關系型資料庫來說,硬碟I/O是一個很大的瓶頸

海量資料的高效率讀寫  

 網站每天産生的資料量是巨大的,對于關系型資料庫來說,在一張包含海量資料的表中查詢,效率是非常低的  

高擴充性和可用性      

            在基于web的結構當中,資料庫是最難進行橫向擴充的,當一個應用系統的使用者量和通路量與日俱增的時候,資料庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬體和服務節點來擴充性能和負載能力。對于很多需要提供24小時不間斷服務的網站來說,對資料庫系統進行更新和擴充是非常痛苦的事情,往往需要停機維護和資料遷移。  

對網站來說,關系型資料庫的很多特性不再需要了

事務一緻性      

 關系型資料庫在對事物一緻性的維護中有很大的開銷,而現在很多web2.0系統對事物的讀寫一緻性都不高    

讀寫實時性      

 對關系資料庫來說,插入一條資料之後立刻查詢,是肯定可以讀出這條資料的,但是對于很多web應用來說,并不要求這麼高的實時性,比如發一條消息之後,過幾秒乃至十幾秒之後才看到這條動态是完全可以接受的    複雜SQL,特别是多表關聯查詢

MongoDB的資料類型?

null null用于表示空值或者不存在的字段。 {"x":null}
布爾  布爾類型有兩個值'true'和'false1'. {"X":true}
32位整數  類型不可用。JavaScript僅支援64位浮點數,是以32位整數會被自動轉換。
64位整數  不支援這個類型。shell會使用一個特殊的内嵌文檔來顯示64位整數
64位浮點數  shell中的數字都是這種類型。下面的表示都是浮點數: {"X" : 3.1415926} {"X" : 3}
字元串  UTF-8字元串都可表示為字元串類型的資料: {"x" : "foobar"}
符号 不支援這種類型。shell将資料庫裡的符号類型轉換成字元串。
對象id  對象id是文檔的12位元組的唯一 ID, {"X" :ObjectId() }
日期 日期類型存儲的是從标準紀元開始的毫秒數。不存儲時區: {"X" : new Date()}
正規表達式 

文檔中可以包含正規表達式,采用JavaScript的正規表達式文法: {"x" : /foobar/i}

代碼  文檔中還可以包含JavaScript代碼:{"x" : function() {  }}

二進制資料  二進制資料可以由任意位元組的串組成。不過shell中無法使用。
最大值  BSON包括一個特殊類型,表示可能的最大值。shell中沒有這個類型。
最小值 BSON包括一個特殊類型,表示可能的最小值。shell中沒有這個類型。
未定義 文檔中也可以使用未定義類型:{"x":undefined}
數組  值的集合或者清單可以表示成數組:{"x" : ["a", "b", "c"]}

MongoDB常用Sql語言?

查詢篇

show dbs 檢視資料庫

db.cloneDatabase(“127.0.0.1”) 将指定機器上的資料庫的資料克隆到目前資料庫

db.copyDatabase("mydb", "temp", 127.0.0.1") 将本機的mydb的資料複制到temp資料庫中

db.repairDatabase()修複目前資料庫

db.getName() 檢視目前使用資料庫

db.version() 檢視資料庫版本

db.getMongo()檢視目前db的連結機器位址

db.userInfo.find() 相當于:select* from userInfo db.userInfo.distinct("name") 會過濾掉name中的相同資料

相當于:select distict name from userInfo db.userInfo.find({"age": 22}) 條件查詢

相當于:select * from userInfo where age = 22 db.userInfo.find({name: /mongo/});模糊查詢

相當于:select * from userInfo where name like ‘%mongo%'

db.userInfo.find({}, {name: 1, age: 1})

相當于:select name, age from userInfo

查詢指定列name、age資料 升序:db.userInfo.find().sort({age: 1}) 降序:db.userInfo.find().sort({age: -1})

查詢name = zhangsan, age = 22的資料

db.userInfo.find({name: 'zhangsan', age: 22})

相當于:select * from userInfo where name = 'zhangsan' and age = '22'

分頁:db.userInfo.find().limit(10).skip(5) select * from userInfo limit 10,5

插入更新篇

db.users.save({name: ‘zhangsan', age: 25, sex: true});

添加 db.users.insert({name: ‘zhangsan', age: 25, sex: true});

添加 insert 和save 都是添加 db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);

相當于:update users set name = ‘changeName' where age = 25;

修改age=25 db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);

相當于:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';

增加字段篇

db.url.update({}, {$set: {content:""}}, {multi: 1}) ‘userinfo’表的名稱 ‘content’ 字段名稱

增加字段 db.url.update({age:”21”}, {$set: {content:""}}, {multi: 1}) ‘age’篩選條件‘userinfo’表的名稱 ‘content’

字段名稱 增加字段 db.url.update({},{$unset:{'content':''}},false, true)

删除篇

條件删除

db.users.remove({age: 132});

删除目前資料庫

db.dropDatabase()

删除所有資料

db.col.remove({})

MongoDB中insert和save的差別?

若新增的資料中存在主鍵 ,insert() 會提示錯誤,而save() 則更改原來的内容為新内容。 如: 已存在資料:{_id : 1, " name " : " n1 " },再次進行插入操作時, insert({_id : 1, " name " : " n2 " }) 會報主鍵重複的錯誤提示 save({ _id : 1, " name " : " n2 " })會把 n1 修改為n2。 相同點: 若新增的資料中沒有主鍵時,會增加一條記錄。

什麼是MongoDB 索引?

db.userInfo.ensureIndex({name: 1});建立索引

db.userInfo.getIndexes();查詢目前索引

db.userInfo.totalIndexSize();檢視總索引記錄大小

db.users.dropIndex("name_1");删除目前索引

db.users.dropIndexes();删除所有索引

什麼是MongoDB 聚合?

count 函數 distinct 函數 group 函數 集合的count函數是最簡單的聚合函數,傳回集合中文檔的數量。 $sum 計算總和。 $avg  計算平均值。 $min  擷取集合中所有文檔對應值得最小值。 $max  擷取集合中所有文檔對應值得最大值。 $push  在結果文檔中插入值到一個數組中。 $addToSet 在結果文檔中插入值到一個數組中,但不建立副本。 $first 根據資源文檔的排序擷取第一個文檔資料。 $last  根據資源文檔的排序擷取最後一個文檔資料。

為什麼使用MongoDB分片?

分片 在Mongodb裡面存在另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。 當MongoDB存儲海量的資料時,一台機器可能不足以存儲資料,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多台機器上分割資料,使得資料庫系統能存儲和處理更多的資料。 為什麼使用分片? 複制所有的寫入操作到主節點 延遲的敏感資料會在主節點查詢 單個副本集限制在12個節點 當請求量巨大時會出現記憶體不足。 本地磁盤不足 垂直擴充價格昂貴

MongoDB資料庫總結

用于存儲實際的資料塊,實際生産環境中一個shard server角色可由幾台機器組個一個replica set承擔,防止主機單點故障 Config Server: mongod執行個體,存儲了整個 ClusterMetadata,其中包括 chunk資訊。 Query Routers: 前端路由,用戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。

歡迎大家加入  “碼農新銳”公衆号,更多技術資料等着您。

MongoDB資料庫總結