MongoDB權威指南——入門

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。
相關文章
相關標籤/搜索