MongoDB權威指南 第二章 入門 文檔是MongoDB中數據的基本單元,相似於RDBS中的行。 集合能夠看做是沒有模式的表。 MongoDB中單個實例能夠容納多個獨立的數據庫。 MongoDB帶有JavaScript shell。 每個文檔都有一個特殊鍵"_id",它在文檔所處的集合是惟一的。 2.1 文檔 多個鍵及其關聯的值有序的放在一塊兒就是文檔。 在JavaScript中文檔表示對象。 {"greeting" : "hello world"} 文檔的鍵是字符串。鍵可使用任意UTF-8字符。 MongoDB不區分類型,也不區分大小寫。可是不能有重複的鍵。 2.2 集合 集合就是一組文檔。 2.2.1 無模式 集合是無模式的。意味着集合裏面的文檔能夠是各類各樣的。把同種類型的文檔放在一個集合裏面,這樣數據會更集中。 當建立索引時,文檔會有附加的結構。索引是按照集合來定義的, 2.2.2 命名 集合不能爲空。 集合名不能以"system."開頭,這是系統集合保留的前綴。 用戶建立的集合名稱不能包含保留字符$。 子集合 組織集合慣例使用"."字符分開的按命名空間劃分的子集合。 假如博客系統包含兩個集合,分別爲blog.posts和blog.authors。blog這個集合與其子集合沒有任何關係。 不少MongoDB工具包含了子集合。 GridFS是一種存儲大文件的協議,使用子集合來存儲文件的元數據。 MongoDB的web控制檯經過子集合的方式將數據組織在DBTOP部分 絕大多數驅動程序都提供了語法糖,爲訪問指定集合的子集合提供方便。 2.3 數據庫 MongoDB中的多個文檔組成集合,一樣多個集合能夠組成數據庫。 數據庫的名字標識不能是空字符串,不能有空格,$,/,\等,所有小寫,最多64字節。 有些數據庫名是保留的。 admin:至關於具備root權限的數據庫。 local:這個數據永遠不會複製,用來存儲本地單臺服務器的任意集合。 config:當MongoDB用來分片設置時,config數據庫在內部使用,用於保存分片的信息。 把數據名放在集合名前,獲得集合的徹底限定名,成爲命名空間。命名空間應小於100字節。 2.4 啓動MongoDB MongoDB啓動了一個基本的HTTP服務器,監聽端口比主端口高1000。能夠經過瀏覽器訪問http://localhost:28017獲取數據庫的管理信息。 2.5 MongoDB shell MongoDB自帶JavaScript shell。 2.5.1 運行shell shell徹底具有javascript解釋器: > x = 200; 200 > x / 5 40 能夠利用js標準庫: > Math.sin(Math.PI/2); 1 > new Date(); ISODate("2014-02-26T12:43:42.516Z") > "hello, world".replace("world", "caoqing"); hello, caoqing > 能夠定義和利用js函數: > function factial(n) { ... if (n <= 1) return 1; ... return n * factial(n-1); ... } > factial(5); 120 2.5.2 MongoDB客戶端 shell還有非js語法的擴展,方便習慣SQL shell的用戶添加。 2.5.3 shell中的基本操做 建立,讀取,更新和刪除(CRUD)。 1.建立 insert函數添加文檔到集合。 > post = ({name : "caoqing", age : 25, address : "china", date : new Date() }) { "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z") } > db.blog.insert(post); > db.blog.find(); { "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z") } 2.讀取 find會返回集合裏的全部文檔,若只想查詢一個,使用findOne: > db.blog.findOne(); { "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z") } find和findOne能夠接受查詢文檔形式的限定條件。 3.更新 update接受至少兩個參數,要更新文檔的限定條件,新的文檔。 > post.comments = [] [ ] > db.blog.update({name : "caoqing"}, post); > db.blog.find(); { "_id" : ObjectId("530de294a5a40b4574eaa3b7"), "name" : "caoqing", "age" : 25, "address" : "china", "date" : ISODate("2014-02-26T12:48:09.225Z"), "comments" : [ ] } 4.刪除 remove用來從數據庫中永久地刪除文檔。能夠接受一個限定條件,在不使用參數狀況下,會刪除集合裏的全部文檔。 > db.blog.remove({name : "caoqing"}); > db.blog.find(); > 2.5.4 使用js shell help查看在線文檔。 db.help(),查看數據庫級別的命令。 db.foo.help(),查看集合級別的命令。 不輸入括號狀況下,能夠查看該函數的js源代碼。 > db.version; function (){ return this.serverBuildInfo().version; } 集合名 若是集合名是數據庫類的一個屬性就有問日了,只有js找不到指定屬性時,才能做爲集合返回。當有屬性與目標集合名重名時,可使用getCollection函數。 2.6 數據類型 2.6.1 基本的數據類型 JSON的表現力很強,只有null,布爾,數字,字符串和數組,對象幾種類型。 MongoDB在此基礎上添加了一些其餘數據類型。 對象ID,日期,正則表達式,代碼,二進制數據,最大值,未定義,數組,內嵌文檔 2.6.2 數字 MongoDB有三種數組,32位浮點數,64位浮點數和32位整數。 要插入的64位整數不能準確的做爲雙精度數顯示。 2.6.3 日期 Date對象用作MongoDB的日期類型。 字符串和日期不能互相匹配。 2.6.4 數組 數組是一組值,能夠做爲有序對象,或無序對象操做。 2.6.5 內嵌文檔 2.6.6 _id和ObjectId MongoDB中存儲的文檔必須有一個"_id"鍵,每一個鍵的值是任意類型的,一個集合中只有一個。 1. ObjectId ObjectId使用十二個字節的存儲空間,每一個字節兩位十六進制數字,是一個24位的字符串。 12個字節:4位時間戳,三位機器碼,2位PID,三位計數器。 前4個字節隱含了文檔的建立時間。 3字節是所在主機的惟一標識符。 接下來的兩個字節是該進程標識符。 後三個字節是一個計數器。 2. 自動生成OjectId 系統會自動幫你建立一個,可是一般在客戶端由驅動程序完成。 避免產生開銷。 驅動程序提供更加豐富的API。