標籤:
MongoDB是一個基於分布式檔案儲存體的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充的高效能資料儲存解決方案。 MongoDB是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。
在這裡我們有必要先簡單介紹一下非關係型資料庫(NoSQL)
1.什麼是NoSQL
NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。 NoSQL用於超大規模資料的儲存。(例如Google或Facebook每天為他們的使用者收集萬億位元的資料)。這些類型的資料存放區不需要固定的模式,無需多餘操作就可以橫向擴充。
2.關係型資料庫 PK 非關係型資料庫
RDBMS |
NoSQL |
高度組織化結構化資料 |
代表著不僅僅是SQL |
結構化查詢語言 (SQL)(SQL) |
沒有聲明性查詢語言 |
資料和關係都儲存在單獨的表中。 |
沒有預定義的模式 |
資料操縱語言,資料定義語言 (Data Definition Language) |
鍵 - 值對儲存,列儲存,文檔儲存,圖形資料庫 |
嚴格的一致性 |
最終一致性,而非ACID屬性 |
基礎事務 |
非結構化和不可預知的資料 |
|
CAP定理 |
|
高效能,高可用性和延展性 |
3.NoSQL分類
類型 |
部分代表 |
特點 |
列儲存 |
Hbase Cassandra Hypertable |
顧名思義,是按照列儲存資料的。最大的特點是方便儲存結構化和半結 構化的資料,方便做資料壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢 |
文檔儲存 |
MongoDB CounchDB |
文檔儲存一般用類似json的格式儲存,儲存的內容是文檔型的。這樣也就有有機 會對某些欄位建立索引,實現關聯式資料庫的某些功能。 |
key-value儲存 |
Tokyo Cabinet / Tyrant Berkelery DB MemcacheDB Redis |
可以通過key快速查詢到其value。一般來說,儲存不管value的格式, 照單全收。(Redis包含了其他功能) |
圖儲存 |
Neo4J FlockDB |
圖形關係的最佳儲存。使用傳統關聯式資料庫來解決的話效能低下, 而且設計使用不方便。 |
Object Storage Service |
db4o Versant |
通過類似物件導向語言的文法操作資料庫,通過對象的方式儲存資料。 |
xml資料庫 |
Berkeley DB XML BaseX |
高效的儲存XML資料,並儲存XML的內部查詢文法,比如XQuery,Xpath。 |
4.CAP原則
在電腦科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer‘s theorem), 它指出對於一個分散式運算系統來說,不可能同時滿足以下三點:
- 一致性(Consistency) (所有節點在同一時間具有相同的資料)
- 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance) (系統中任意資訊的丟失或失敗不會影響系統的繼續運作)
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的滿足兩個。 因此,根據 CAP 原理將 NoSQL 資料庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類: CA - 單點叢集,滿足一致性,可用性的系統,通常在可擴充性上不太強大。 CP - 滿足一致性,分區容忍必的系統,通常效能不是特別高。 AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。
5.mongodb資料結構
MongoDB的基礎單元——文檔
文檔是MongoDB的核心概念。多個索引值對有序的放置在一起便是文檔。
Js代碼:
1 {"course1":"MongoDB","course2":"hadoop"}
說明:文檔是有序的,鍵是區分大小寫
集合
集合就是一組文檔。
集合是無模式的,即:一個集合中的文檔可以是各式各樣的例如:
集合代碼:
1 {"course1":"hadoop","course2":"hive"} 2 {"studentName":"小紅"}
資料庫
MongoDB中多個集合組成資料庫。一個MongoDB執行個體可以承載多個資料庫,它們之間可視為完全獨立的。每個資料庫有自己的許可權控制
6.關係型資料庫與MongoDB邏輯結構對比
對於習慣了關係型資料庫的朋友們,我將MongoDB與關係型資料庫的邏輯結構進行了對比。
MongoDB |
關係型資料庫 |
文檔(document) |
行(row) |
集合(collection) |
表(table) |
資料庫(database) |
資料庫(database) |
7.測試MongoDB
1 > show dbs //顯示資料庫資訊 2 local (empty) 3 > db //查看當前連結到那個資料庫 4 test 5 > user test //使用test資料庫 6 Fri Mar 28 10:20:14 SyntaxError: missing ; before statement (shell):1 7 > use test 8 switched to db test 9 > post = {"title":"love","content":"I love you"} //定義文檔 10 { "title" : "love", "content" : "I love you" } 11 > db 12 test 13 > db.test.blog.insert(post) //將文檔插入到集合中 14 > db.test.blog.find() //查詢集合 15 { "_id" : ObjectId("5334dd149b7a445ea2166559"), "title" : "love", "content" : "I 16 love you" } 17 > post = {"job":"java","city":"wuhan"} 18 { "job" : "java", "city" : "wuhan" } 19 > db.test.blog.insert(post) 20 > db.test.blog.find() 21 { "_id" : ObjectId("5334dd149b7a445ea2166559"), "title" : "love", "content" : "I 22 love you" } 23 { "_id" : ObjectId("5334dd669b7a445ea216655a"), "job" : "java", "city" : "wuhan" 24 } 25 >
8.MongoDB中的資料類型
null
1 {"x":null}
布爾
1 {"x":true}
32位整數
64位整數
64位浮點數
字串
1 {"x":"hi world"}
對象id
日期
1 {"x":new Date()}
Regex
1 {"x":/foobar/i}
函數
1 {"x":function(){//......}}
位元據
可以由任意位元組的串組成
最大值
最小值
未定義
1 {"x":undefined}
數組
1 {"x":["a","b","c"]}
內嵌文檔
1 {"x":{"foo":"bar"}}
9._id和ObjectId
Mongodb中儲存的文檔必須有一個“_id”鍵。這個鍵的值可以是任何類型的,預設是ObjectId對象。在集合中,每個文檔都有唯一的“_id”,來確保集合裡面每個文檔都能被唯一標示。
一個BSON ObjectID是12位元組的值,包含了4位元組的時間戳記(紀元以來的秒數),3位元組機器id,2位元組進程id,和3位元組計數值。注意不同於BSON中的其他欄位,時間戳記和計數值欄位必須儲存為big endian。這是由於會對它們按位元組比較,我們希望大多數情況下保證是升序。它的格式:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
time |
machine |
pid |
inc |
轉載:http://zc985552943.iteye.com/blog/2037887
mongoDB入門