MongoDB 第一篇

一、MongoDB 權(quán)威指南

親身經(jīng)歷了在快速發(fā)展的大型互聯(lián)網(wǎng)公司應(yīng)于MySQL的過(guò)程。開(kāi)始
時(shí)只有很少的數(shù)據(jù),一臺(tái)服務(wù)器就可以了。然后就得建立備份,以便應(yīng)對(duì)大量
的讀取和不時(shí)的當(dāng)季。用不了多久,就得加一個(gè)緩存層,調(diào)整所有的查詢。
投入更多的硬件。

MongoDB是是一款強(qiáng)大、靈活、且易于擴(kuò)展的通用性數(shù)據(jù)庫(kù)。它能擴(kuò)展出
非常多的功能,如二級(jí)索引, 范圍查詢,排序,聚合,以及地理空間索引

縱向擴(kuò)展就是適用計(jì)算能力更強(qiáng)的機(jī)器,而橫向擴(kuò)展就是通過(guò)分區(qū)將
數(shù)據(jù)分散到更多的機(jī)器上。通常,縱向擴(kuò)展是最省力的做法,其缺點(diǎn)是大型機(jī)
一般都非常昂貴。而且,當(dāng)數(shù)據(jù)量達(dá)到機(jī)器的物理極限時(shí),無(wú)論話多少錢(qián)也買(mǎi)不到
更強(qiáng)的機(jī)器了。

另一個(gè)選擇是橫向擴(kuò)展;要增加存儲(chǔ)空間或提高性能,只需購(gòu)買(mǎi)一臺(tái)普通的服務(wù)器
并把它添加到集群中就可以了。

橫向擴(kuò)展的缺點(diǎn)就是,維護(hù)一個(gè)1000個(gè)集群的機(jī)器,比一個(gè)維護(hù)一個(gè)機(jī)器更麻煩。

二、為什么MongoDB 更易于橫向擴(kuò)展呢?

因?yàn)镸ongoDB 的主鍵不是自增的,所以不會(huì)有自增時(shí)候的限制。
并且使用類(lèi)似UUID的方式,更加適用于分布式存儲(chǔ)

這里需要研究下UUID的存儲(chǔ)

三、MongoDB 提供一個(gè)卓越的性能。

MongoDB的一個(gè)主要目標(biāo)是提供卓越的性能。這很大成都上決定了MongoDB的設(shè)計(jì)。
MongoDB能對(duì)文檔進(jìn)行動(dòng)態(tài)填充(dynamic padding),也能預(yù)分配數(shù)據(jù)文件以利用
額外的空間來(lái)?yè)Q取穩(wěn)定的性能。MongoDB把竟可能多的內(nèi)存做緩存(cache),
試圖在各方面都保持他的卓越性能。

四、MongoDB 不提供

MongoDB 不提供連接(join)和復(fù)雜的多行事務(wù)(multirow trasaction).
省略這些功能是出于架構(gòu)上的考慮,因?yàn)樵诜植际较到y(tǒng)中這兩個(gè)功能難以高效的實(shí)現(xiàn)

五、MongoDB 存儲(chǔ)的特點(diǎn)

  • 文檔的鍵是字符串。

  • 鍵不能含有\(zhòng)0(空字符串)。這個(gè)字符用于表示鍵的結(jié)尾

  • .和$具有特殊意義

  • MongoDB 的文檔不能有重復(fù)的鍵。下面的文檔就是非法的

{ "greeting": "Hello, world!", "greeting": "Hello, MongoDB!" }

  • 文檔中的鍵/值對(duì)是有序的

{ "x": 1, "y": 2 } 與 { "y": 2, "x": 1 } 是不同的

六、MySQL 與 MongoDB 的映射

MySQL MongoDB
db(tables) db(collections)

table collection

record document

七、動(dòng)態(tài)模式

集合是動(dòng)態(tài)的。這意味著一個(gè)集合里面的文檔可以是各種各樣的。
例如,下面兩個(gè)文檔可以存儲(chǔ)在同一個(gè)集合里面

{ "greeting": "Hello, world!" }
{ "foo" : 5 }

但還是有必要設(shè)計(jì)多個(gè)集合

  • 查詢簡(jiǎn)單。

  • 磁盤(pán)尋道操作更少。

  • 創(chuàng)建索引,使用文檔的附加結(jié)構(gòu)。一個(gè)集合中只放入一種類(lèi)型的文檔,可以更有效地
    對(duì)集合進(jìn)行索引。

八、命名

集合不能出現(xiàn)以下情況

1、不能為空字符串
2、不能包含\0字符
3、不能以system.開(kāi)頭
4、不能包含$

九、子集合

組織集合的一種慣例是使用“.”分隔不同命名空間的自己合。
例如,一個(gè)具有博客功能的應(yīng)用可能包含兩個(gè)集合,分別是
blog.posts 和 blog.authors 這是為了使組織結(jié)構(gòu)更加清晰。
這里的blog集合(這個(gè)集合甚至不需要存在)跟它的子集合
沒(méi)有任何關(guān)系

十、數(shù)據(jù)庫(kù)命名限制

  • 不能是空字符串。
  • 不能還有特殊符號(hào), 可以使用- 或 _。數(shù)字或字母。
  • 區(qū)分大小寫(xiě)。
  • 最多64位。

如果要使用cms數(shù)據(jù)庫(kù)中的blog.posts集合,這個(gè)結(jié)合的命名空間
就是cms.blog.posts。命名空間的長(zhǎng)度不得超過(guò)121個(gè)字節(jié)

十一、MongoDB 啟動(dòng)

 使用 mongod 啟動(dòng)

mongod 在沒(méi)有參數(shù)的情況下會(huì)適用默認(rèn)數(shù)據(jù)目錄/data/db。
如果數(shù)據(jù)目錄不存在或者不可寫(xiě),服務(wù)器會(huì)啟動(dòng)失敗。

MongoDB 監(jiān)聽(tīng)27017 端口。

MongoDB還會(huì)啟動(dòng)一個(gè)非?;镜腍TTP服務(wù)器,監(jiān)聽(tīng)數(shù)字比主
端口號(hào)高1000的端口,也就是28017 端口。這意味著,通過(guò)瀏覽器
訪問(wèn)http://localhost:28017 能獲取數(shù)據(jù)庫(kù)的管理信息。

十二、MongoDB shell簡(jiǎn)介

MongoDB 自帶JavaScript shell, 可在shell中適用命令行
能運(yùn)行任意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 方法可將文檔從數(shù)據(jù)庫(kù)中永遠(yuǎn)刪除。
如果沒(méi)有使用任何參數(shù),它將集合內(nèi)的所有文檔全部刪除。
它可以接受一個(gè)作為限定條件的文檔作為參數(shù)。

> db.blog.remove({title: "My Blog Post"})

十四、數(shù)據(jù)類(lèi)型

  • null

  { "x" : null }

  • 布爾型
  { "x" : true }
  • 數(shù)值

  { "x" : 3.14 }
  { "x" : NumberInt("3")}
  { "x" : NumberLong("3") }

  • 字符串

  { "x" : "foobar" }

  • 日期

毫秒數(shù)


  { "x" : new Date() }

  • 正則表達(dá)式

{ "x" : /foobar/i }

  • 數(shù)組

  { "x": ["a", "b", "c"]}

  • 內(nèi)嵌文檔

  {"x": {"foo" : "bar"}}

  • _id

  { "x" : ObjecteId() }

  • 二進(jìn)制數(shù)據(jù)

所以可以存儲(chǔ)任何的文件

  • 甚至代碼

{ "x" : function() { /* ... */ } }

參考 《MongoDB 權(quán)威指南》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容