MongoDB的簡單入門

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。

原文博客

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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