MongoDB的基本概念
- MongoDB的數(shù)據(jù)單元是
文檔,可以看作JavaScript中的對(duì)象,類似于關(guān)系數(shù)據(jù)庫中的行。 - 集合(Collection)類似于關(guān)系數(shù)據(jù)庫中的表,區(qū)別在于沒有模式。
- 每個(gè)MongoDB數(shù)據(jù)庫都自身的集合和權(quán)限。
- MongoDB的操作主要靠終端的JavaScript Shell完成。
文檔
在JavaScript中,文檔表示為對(duì)象:
{"name": "XueSeason", "age": 22}
以上文檔有一個(gè)name鍵,其值為XueSeason,age鍵值為22。
從這個(gè)文檔,解釋了幾個(gè)概念:
- 文檔中的鍵值對(duì)是有序的,上面例子中如果調(diào)換name和age的鍵值對(duì),將會(huì)被視為一個(gè)新的文檔。
- 文檔中的值不僅僅只限于字符串形式,還有其他更高級(jí)的類型。
- 文檔的鍵使用
UTF-8字符。其中.和$通常被保留,只有在特定環(huán)境下使用,_也是保留的。
集合
集合就是文檔集,作為NoSQL是區(qū)別于關(guān)系數(shù)據(jù)庫的表。
無模式
集合是無模式的。即不同類型的文檔可以共存于同一個(gè)集合中:
{"name": "XueSeason", "age": 22}
{"book": "The old man and the Sea"}
注意上面的文檔是完全不同的兩個(gè)文檔。既然一個(gè)集合可以容納各種類型,為何需要多集合?
使用多集合的意義在于:
- 降低熵值。即減少混亂程度。
- 速度上的優(yōu)越性。把一個(gè)特定類型的文檔分成多個(gè)子集合提高查詢效率。
- 把同種類型的文檔存在一個(gè)集合匯總,使數(shù)據(jù)更集中。
推薦盡量使用子集合來組織數(shù)據(jù)。
命名
- 集合名不能為空字符串。
- 不能含有
\0字符。 - 不能以
system.開頭,系統(tǒng)集合的保留前綴。 - 不能含有保留字符
$。
啟動(dòng)MongoDB
確保你成功安裝MongoDB并且正確配置。
終端輸入mongod命令。
如果出現(xiàn)類似以下信息:
2015-03-28T13:35:04.067+0800 W - [initandlisten] Detected unclean shutdown - /data/db/mongod.lock is not empty.
2015-03-28T13:35:04.067+0800 I STORAGE [initandlisten] exception in initAndListen: 98 Unable to lock file: /data/db/mongod.lock errno:35 Resource temporarily unavailable. Is a mongod instance already running?, terminating
2015-03-28T13:35:04.067+0800 I CONTROL [initandlisten] dbexit: rc: 100
表明已經(jīng)有一個(gè)MongoDB程序在后臺(tái)運(yùn)行。
可以通過ps -ef查找到相關(guān)的pid,執(zhí)行kill [pid]強(qiáng)制關(guān)閉。
MongoDB在沒有參數(shù)的情況下默認(rèn)會(huì)使用/data/db目錄,并監(jiān)聽27017端口。
如果該目錄不存在或者不可寫,服務(wù)器也會(huì)啟動(dòng)失敗。
MongoDB Shell
運(yùn)行mongo啟動(dòng)shell:
xuejijiedeMacBook-Pro:~ xuejijie$ mongo
MongoDB shell version: 3.0.1
connecting to: test
>
此時(shí),你可以用REPL方式執(zhí)行JavaScript代碼。
MongoDB客戶端
MongoDB Shell的真正強(qiáng)大不僅在于是一個(gè)JavaScript的解釋器,而且還是一個(gè)MongoDB客戶端。
開啟的時(shí)候,shell會(huì)連到MongoDB服務(wù)器的test數(shù)據(jù)庫,并將這個(gè)數(shù)據(jù)庫連接賦值給全局變量db。
選擇數(shù)據(jù)庫:
> use mydatabase
switched to db mydatabase
> db
mydatabase
CRUD
接下來學(xué)習(xí)下操作數(shù)據(jù)的4個(gè)基本操作。
創(chuàng)建
使用insert函數(shù),可以添加文檔到對(duì)應(yīng)的集合中。
> post = { "title": "The first day", "content": "It is awesome time", "date": new Date()}
{
"title" : "The first day",
"content" : "It is awesome time",
"date" : ISODate("2015-03-28T05:53:16.355Z")
}
> db.blog.insert(post)
WriteResult({ "nInserted" : 1 })
> db.blog.find()
{ "_id" : ObjectId("551641e5b1f58081c3b9d7ea"), "title" : "The first day", "content" : "It is awesome time", "date" : ISODate("2015-03-28T05:53:16.355Z") }
上述操作首先創(chuàng)建一個(gè)post對(duì)象,然后通過insert方法將數(shù)據(jù)存放到blog集合中,最后通過find函數(shù),展示blog集合中的所有文檔。
此時(shí)文檔多了額外的鍵_id,是系統(tǒng)自動(dòng)添加的主鍵。
讀取
find會(huì)返回集合的所有文檔。若只想查看一個(gè)文檔,可以用findOne。
關(guān)于更多查詢內(nèi)容,將作為新的文章講解。
更新
update函數(shù)接受兩個(gè)參數(shù):所更新文檔的限定條件,新的文檔。
> post.comment = []
[ ]
> db.blog.update({title: "The first day"}, post)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.find()
{ "_id" : ObjectId("551641e5b1f58081c3b9d7ea"), "title" : "The first day", "content" : "It is awesome time", "date" : ISODate("2015-03-28T05:53:16.355Z"), "comment" : [ ] }
刪除
remove函數(shù)永久刪除文檔,如果無參,就會(huì)刪除集合內(nèi)的所有文檔。也可以接受限定條件刪除指定內(nèi)容。
更多shell指令可以通過help查看,或者參考官方doc。