煮酒品茶:大量序語和執行個體引用自書中,品茶對其實驗後做的筆記上傳至部落格,任何有著作權的人都可以直接下架下文章,謝謝合作。
2012/8/14 14:00 MongoDB筆記一之簡介與入門第一次編輯:排版】
elain2012寫的MongoDB 實戰系列,真心不錯!http://blog.51cto.com/zt/99 MongoDB權威指南
第一章MongoDB是一種強大、靈活、可擴充的資料存放區方式。它擴充了關係型資料庫的眾多有用功能,如輔助索引、範圍查詢和排序。MongoDB的功能非常豐富,比如內建的對MapReduce式彙總的支援,以及對地理空間索引的支援。優點:
1、豐富的資料模型MongoDB是面向文檔的資料庫,將原來的“行”(row),的概念換成更加靈活的“文檔”document)模型。MongoDB沒有模式:文檔的鍵不會事先定義也不會固定不變。
2、容易擴充採用的面向文檔的資料模型使其可以自動在多台伺服器之間分割資料,還可以平衡叢集的資料和負載,自動重排文檔,開發人員可以專註於編寫應用,需要更大的容量,只需在叢集中添加新機器,然後讓資料庫來處理剩下的事。
3、豐富的功能索引多種快速查詢,也提供了咱一的,複合的和地理空間索引能力。)儲存JavaScript(開發人員不必使用預存程序了,可以直接在服務端儲存JavaScript的函數和值)彙總支援MapReduce和其它彙總工具)固定集合集合的大小是有上限的,對某些類型的資料如:日誌】特別有用)檔案儲存體支援用一種容易使用的協議儲存大型檔案和檔案的中繼資料)
4、不犧牲速度
5、簡便的管理主從複製,複本集,分區等。
第二章 入門
基本概念----------------------------------------文檔是MongoDB中資料的基本單元。(doucument)集合可以被看做是沒有模式的表collections)MongoDB的單個執行個體可以容納多個獨立的資料庫,每一個都有自己的集合和許可權。MongoDB內建JavaScript shell,用於管理MongoDB執行個體和操和資料。每一個文檔都有一個特殊的鍵"_id",它在文檔所處的集合中是咱一的。-----------------------------------------文檔:多個鍵及其關聯的值有序的放置在一起便是文檔。key:vlaue)
{"cwtea" : "hello","key":"vlaue"} |
註:文檔中鍵的順序並不重要。
1、文檔中的鍵/值對應是有序的 {"cwtea" : "hello","key":"vlaue"}和{"key":"vlaue","cwtea" : "hello"}完全不同 2、文檔中的值可以是多種資料類型,整字,字串,甚至文檔。鍵可以使用任意UTF-8字元。 3、鍵不能含有\0Null 字元),這個字元用來表示鍵的結尾。 4、.和$有特別的意義,只有在特定環境下才能使用。 5、以底線"_"開頭的鍵是保留的,雖然這個並不是嚴格要求的。 6、mongoDB區分類型和區分大小寫 {"foo" : 3} 不同於{"foo" : "3"} 整數和字串 { "foo" : "3"}不同於{"Foo" : "3"} 大小寫 7、mongoDB不能有重複的鍵 |
集合概念:集合就是一組文檔 collections
無模式概念:不同文檔可存在同一個集合中。
命名:可以滿足下列條件的任意UTF-8字串。1、集合名不能是Null 字元串""2、集合名不能含 有\0字元(Null 字元),這個字元表示集合名的結尾.3、集合名不能以"system."開發,這是為系統集合保留的首碼。4、使用者建立的集合名字不能含有保留字元$。有些驅動程式的確支援在集合名裡麵包含$,這是因為某些系統產生的集合中包含該字元。
子集合:組織集合的一種慣例是使用 "." 字元分開的按命名空間劃分的子集合。GridFS是一種儲存大檔案的協議,使用子集合來隱藏檔的中繼資料,這樣就與內容分開了。Web控制台通過子集合的方式將資料群組織在DBTOP部分絕大多數驅動程式都提供文法糖,為訪問指定集合的子集合提供方便。db.blog代表blog集合,db.blog.posts代表blog.posts集合)
資料庫:多個集合組成資料庫。一個MongoDB執行個體可承載多個資料庫,它們之間可視為完全獨立,每個資料庫都有獨立的許可權控制,即便在磁碟上,不同的資料庫存也放在不同的檔案中。命名:資料庫名最終會變成檔案系統裡的檔案,所以會有以下限制。不能是Null 字元串"")不得含有''(空格)、,、$、/、/和\0(Null 字元)就全部是小寫最多64位元組
保留的資料庫名:admin(是"root"資料庫,添加一個使用者到這個資料庫,則具有最高許可權)local這個資料永遠不會被複製,可以用來儲存限於本地單台伺服器的任意集合)config當Mongo用於分區設定時,config資料庫在內部使用,用於儲存分區的相關資訊)
命名空間:把資料庫的名字放到集合名前面,得到就是集合的完全限定名db.blog.posts,命名空間的長度不得超過121,實際使用最好不超過100位元組。
MongoDB shell內建一個javascript shell,可以從命令列與MongoDB執行個體互動,可以執行管理操作,檢查運行執行個體,變或做其他嘗試。可以做javascript所做之事。
> math.sin(math.pi /2) Mon Aug 13 23:28:19 ReferenceError: math is not defined (shell):1 > Math.sin(Math.PI /2) 1 > new Date("2010/1/1") ISODate("2009-12-31T16:00:00Z") > new Date("2010/1/1"); ISODate("2009-12-31T16:00:00Z") > "hello ,world!".replace("world", "mongodb") hello ,mongodb! > "hello ,world!".replace("world1", "mongodb") hello ,world! > "hello ,2".replace("2", "mongodb") hello ,mongodb > function factorial (n) { ... if (n <=1) return 1; ... return n * factorial(n-1) ... } > factorial(5); 120 |
shell的基本操作:建立、讀取、更新和刪除。建立:
> use blog switched to db blog > post = {"title" : "my blog post", ... "content" : "here is my blog post.", ... "date" : new Date()} { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > db.blog.insert(post) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } |
查詢:find顯示最多20條匹配
> db.blog.findOne() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > db.blog.find({},{"title": 1} ) { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post" } { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two" } |
update更新:至少兩個參數:第一個是要更新的文檔的限定條件,第二個是新的文檔。
> post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z") } > post.comments =[] [ ] > post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ] } > post.test="hello" hello > post { "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } #替換標題為my blog post的文章,第一個為條件,第二個為更新內容。 > db.blog.update({title : "my blog post"}, post) > db.blog.find() { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "two", "content" : ISODate("2012-08-13T16:28:10.372Z") } { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } > db.blog.update({title : "two"}, {"title" : "baidu","content" : "www.cwtea.com" }) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } { "_id" : ObjectId("50292b1a70fc23d6b7514588"), "title" : "baidu", "content" : "www.cwtea.com" } |
刪除:remove用來從資料庫中永久性地刪除文檔
> db.blog.remove({"title" : "baidu"}) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } |
#隨時使用help可以使用集合javascript)
基礎資料型別 (Elementary Data Type):類似於JSON叫BSON的東西。缺點:JSON沒有日期類型,只有一種數字類型,沒法區分浮點數和整數,更不能區分32位和64位元字,也沒有辦法表示其他常用類型,如Regex或函數。MongoDB增加了其他一些資料類型:null、布爾、32整數、64位整數、64位浮點數、字串、符號、對象ID、日期、Regex、代碼、位元據、最大值、最小值、未定義、數組、內嵌文檔。數字日期:date()不等於new date()數組:{"things" : ["pie",3.14]}內嵌文檔
> lq = { "name" : "cwtea", ... "address" : { ... "a" : "1", ... "b" : "2", ... "c" : "3", ... } ... ,"hello" :"cwtea"} { "name" : "cwtea", "address" : { "a" : "1", "b" : "2", "c" : "3" }, "hello" : "cwtea" } > db.blog.insert(lq) > db.blog.find() { "_id" : ObjectId("50292a7870fc23d6b7514586"), "title" : "my blog post", "content" : "here is my blog post.", "date" : ISODate("2012-08-13T16:24:51.467Z"), "comments" : [ ], "test" : "hello" } { "_id" : ObjectId("5029363070fc23d6b7514589"), "name" : "cwtea", "address" : { "a" : "1", "b" : "2", "c" : "3" }, "hello" : "cwtea" } > |
id和Objectld儲存文檔必須有一個"_id"預設是個ObjectId對象。ObjectId
0-3[時間戳記]4-6[機器]7-8[pid]9-11[計數器] |
本文出自 “煮酒品茶” 部落格,請務必保留此出處http://cwtea.blog.51cto.com/4500217/962420