一、MongoDB 權威指南
親身經歷了在快速發(fā)展的大型互聯網公司應于MySQL的過程。開始
時只有很少的數據,一臺服務器就可以了妒貌。然后就得建立備份,以便應對大量
的讀取和不時的當季铸豁。用不了多久灌曙,就得加一個緩存層,調整所有的查詢节芥。
投入更多的硬件在刺。
MongoDB是是一款強大、靈活头镊、且易于擴展的通用性數據庫蚣驼。它能擴展出
非常多的功能,如二級索引, 范圍查詢相艇,排序颖杏,聚合,以及地理空間索引
縱向擴展就是適用計算能力更強的機器坛芽,而橫向擴展就是通過分區(qū)將
數據分散到更多的機器上留储。通常翼抠,縱向擴展是最省力的做法,其缺點是大型機
一般都非常昂貴获讳。而且机久,當數據量達到機器的物理極限時,無論話多少錢也買不到
更強的機器了赔嚎。
另一個選擇是橫向擴展;要增加存儲空間或提高性能胧弛,只需購買一臺普通的服務器
并把它添加到集群中就可以了尤误。
橫向擴展的缺點就是,維護一個1000個集群的機器结缚,比一個維護一個機器更麻煩损晤。
二、為什么MongoDB 更易于橫向擴展呢红竭?
因為MongoDB 的主鍵不是自增的尤勋,所以不會有自增時候的限制。
并且使用類似UUID的方式茵宪,更加適用于分布式存儲
這里需要研究下UUID的存儲
三最冰、MongoDB 提供一個卓越的性能。
MongoDB的一個主要目標是提供卓越的性能稀火。這很大成都上決定了MongoDB的設計暖哨。
MongoDB能對文檔進行動態(tài)填充(dynamic padding),也能預分配數據文件以利用
額外的空間來換取穩(wěn)定的性能凰狞。MongoDB把竟可能多的內存做緩存(cache),
試圖在各方面都保持他的卓越性能篇裁。
四、MongoDB 不提供
MongoDB 不提供連接(join)和復雜的多行事務(multirow trasaction).
省略這些功能是出于架構上的考慮赡若,因為在分布式系統(tǒng)中這兩個功能難以高效的實現
五达布、MongoDB 存儲的特點
文檔的鍵是字符串。
鍵不能含有\(zhòng)0(空字符串)逾冬。這個字符用于表示鍵的結尾
.和$具有特殊意義
MongoDB 的文檔不能有重復的鍵黍聂。下面的文檔就是非法的
{ "greeting": "Hello, world!", "greeting": "Hello, MongoDB!" }
- 文檔中的鍵/值對是有序的
{ "x": 1, "y": 2 } 與 { "y": 2, "x": 1 } 是不同的
六、MySQL 與 MongoDB 的映射
MySQL MongoDB
db(tables) db(collections)
table collection
record document
七粉渠、動態(tài)模式
集合是動態(tài)的分冈。這意味著一個集合里面的文檔可以是各種各樣的。
例如霸株,下面兩個文檔可以存儲在同一個集合里面
{ "greeting": "Hello, world!" }
{ "foo" : 5 }
但還是有必要設計多個集合
查詢簡單雕沉。
磁盤尋道操作更少。
創(chuàng)建索引去件,使用文檔的附加結構坡椒。一個集合中只放入一種類型的文檔扰路,可以更有效地
對集合進行索引。
八倔叼、命名
集合不能出現以下情況
1汗唱、不能為空字符串
2、不能包含\0字符
3丈攒、不能以system.開頭
4哩罪、不能包含$
九、子集合
組織集合的一種慣例是使用“.”分隔不同命名空間的自己合巡验。
例如际插,一個具有博客功能的應用可能包含兩個集合,分別是
blog.posts 和 blog.authors 這是為了使組織結構更加清晰显设。
這里的blog集合(這個集合甚至不需要存在)跟它的子集合
沒有任何關系
十框弛、數據庫命名限制
- 不能是空字符串。
- 不能還有特殊符號, 可以使用- 或 _捕捂。數字或字母瑟枫。
- 區(qū)分大小寫。
- 最多64位指攒。
如果要使用cms數據庫中的blog.posts集合,這個結合的命名空間
就是cms.blog.posts慷妙。命名空間的長度不得超過121個字節(jié)
十一、MongoDB 啟動
使用 mongod 啟動
mongod 在沒有參數的情況下會適用默認數據目錄/data/db幽七。
如果數據目錄不存在或者不可寫景殷,服務器會啟動失敗。
MongoDB 監(jiān)聽27017 端口澡屡。
MongoDB還會啟動一個非吃持浚基本的HTTP服務器,監(jiān)聽數字比主
端口號高1000的端口驶鹉,也就是28017 端口绩蜻。這意味著,通過瀏覽器
訪問http://localhost:28017 能獲取數據庫的管理信息室埋。
十二办绝、MongoDB shell簡介
MongoDB 自帶JavaScript shell, 可在shell中適用命令行
能運行任意JavaScript程序。
十三姚淆、MongoDB 的CRUD
- 創(chuàng)建
> post = {
"title" : "My Blog Post",
"content" : "Here1s my blog post",
"date" : new Date()
}
db.blog.insert(post)
- 查詢
> db.blog.find()
or
> db.blog.findOne()
- 更新
> post.comments = []
> db.blog.update({ title : "My Blog Post"}, post)
- 刪除
使用remove 方法可將文檔從數據庫中永遠刪除孕蝉。
如果沒有使用任何參數,它將集合內的所有文檔全部刪除腌逢。
它可以接受一個作為限定條件的文檔作為參數降淮。
> db.blog.remove({title: "My Blog Post"})
十四、數據類型
- null
{ "x" : null }
- 布爾型
{ "x" : true }
- 數值
{ "x" : 3.14 }
{ "x" : NumberInt("3")}
{ "x" : NumberLong("3") }
- 字符串
{ "x" : "foobar" }
- 日期
毫秒數
{ "x" : new Date() }
- 正則表達式
{ "x" : /foobar/i }
- 數組
{ "x": ["a", "b", "c"]}
- 內嵌文檔
{"x": {"foo" : "bar"}}
- _id
{ "x" : ObjecteId() }
- 二進制數據
所以可以存儲任何的文件
- 甚至代碼
{ "x" : function() { /* ... */ } }
參考 《MongoDB 權威指南》