MongoDB入門(mén)

MongoDB與關(guān)系型數(shù)據(jù)庫(kù)對(duì)比

MongoDB屬于文檔型的非關(guān)系型數(shù)據(jù)庫(kù)勿锅,其他像Redis就屬于鍵值對(duì)型的非關(guān)系型數(shù)據(jù)庫(kù)云石。對(duì)于MongodDB來(lái)說(shuō)它是最接近關(guān)系型數(shù)據(jù)庫(kù)的。因此碰缔,如果有使用Oracle嚼隘、Mysql的話,會(huì)很快上手MongoDB辜膝。

  • 集合:在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中以表(table)的方式組織數(shù)據(jù)无牵,而在MongoDB中取而代之的是集合(collection),也就是說(shuō)厂抖,在MongoDB數(shù)據(jù)庫(kù)中沒(méi)有一張張表茎毁,而是一個(gè)個(gè)集合,集合的作用可以理解為表忱辅。

  • 文檔:在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的表中有一行行記錄(row)七蜘,而在MongoDB中取而代之的是文檔(document),MongoDB是用文檔來(lái)表示數(shù)據(jù)的墙懂。文檔的格式類似json的格式橡卤,例如,{name:"張三",age:20}损搬。

下載

從MongoDB的官網(wǎng) https://www.mongodb.org/ 上下載對(duì)應(yīng)自己系統(tǒng)的版本,我下載的是最新的穩(wěn)定版3.0.6碧库。我為了講解需要下載的是解壓版,接下來(lái)會(huì)一步一步配置數(shù)據(jù)庫(kù)巧勤。如果覺(jué)得麻煩可以通過(guò)軟件源的方式安裝嵌灰,可以參考Install on Linux

安裝配置

  1. 將下載好的壓縮包解壓颅悉,發(fā)現(xiàn)有一個(gè)bin文件夾沽瞭,里面有許多命令腳本程序,介紹兩個(gè)最常用的剩瓶,下面演示會(huì)用到:

    • mongod: 啟動(dòng)數(shù)據(jù)庫(kù)用的命令
    • mongo: 作為數(shù)據(jù)庫(kù)的客戶端驹溃,去連接本地或遠(yuǎn)程的數(shù)據(jù)庫(kù)
  2. 創(chuàng)建一個(gè)文件夾作為練習(xí)MongoDB的目錄,文件夾的名字任意起個(gè)就行延曙,比如叫mongodb豌鹤,文件夾的位置任意。

  3. 將第一步解壓的bin文件夾復(fù)制到第二步創(chuàng)建的mongodb文件夾中搂鲫,接著在mongodb文件夾里面再創(chuàng)建如下三個(gè)文件夾:

    • conf: 啟動(dòng)數(shù)據(jù)庫(kù)的配置文件會(huì)存到這個(gè)文件夾里
    • db: 數(shù)據(jù)庫(kù)存儲(chǔ)的位置
    • log: 數(shù)據(jù)庫(kù)日志文件會(huì)存到這個(gè)文件夾里傍药,順便在log文件夾下新建一個(gè)mongodb.log的空文件用來(lái)記錄日志
  4. 請(qǐng)?jiān)赾onf文件夾下新建mongod.conf文件磺平,作為啟動(dòng)數(shù)據(jù)庫(kù)的配置文件魂仍。MongoDB 2.6 以前的版本配置文件采用鍵值對(duì)的方式配置拐辽,使用軟件源安裝的話生成的配置文件就是這種格式,從2.6以后MongoDB采用YAML格式進(jìn)行配置(當(dāng)然鍵值對(duì)的格式也是可以的擦酌,MongoDB的后續(xù)版本都兼容鍵值對(duì)格式俱诸。),本教程將采用YAML格式來(lái)配置赊舶,其實(shí)YAML格式也很簡(jiǎn)單(具體可以參考MongoDB官方文檔 http://docs.mongodb.org/manual/reference/configuration-options/)睁搭。以下是配置文件內(nèi)容:

     # 配置數(shù)據(jù)庫(kù)綁定的IP和端口號(hào)
     net:
       bindIp: 127.0.0.1
       port: 27017
     
     # 配置數(shù)據(jù)庫(kù)日志的位置,且日志以追加的方式記錄
     systemLog:
       destination: file
       path: /Users/xinyiming/Develop/mongodb/log/mongodb.log
       logAppend: true
     
     # 配置數(shù)據(jù)庫(kù)存儲(chǔ)的位置笼平,journal用于故障恢復(fù)园骆,在生產(chǎn)環(huán)境下必須開(kāi)啟
     storage:
       dbPath: /Users/xinyiming/Develop/mongodb/db
       journal:
         enabled: true
     
     # fork配置為true,則數(shù)據(jù)庫(kù)以后臺(tái)進(jìn)程的方式啟動(dòng)寓调,不會(huì)阻塞當(dāng)前命令窗口锌唾。注意windows下沒(méi)有這個(gè)參數(shù)
     processManagement:
       fork: true
     
     # 認(rèn)證配置,默認(rèn)是無(wú)需用戶名密碼的夺英,如果想開(kāi)啟認(rèn)證晌涕,必須先在數(shù)據(jù)庫(kù)中添加用戶名、密碼及權(quán)限
     security:
       authorization: disabled
    

    以上就是最基本的配置了痛悯,#開(kāi)頭的是注釋余黎,縮進(jìn)不要用tab,用2到3個(gè)空格來(lái)縮進(jìn)载萌,在配置項(xiàng)的:后面有個(gè)空格惧财,不然啟動(dòng)時(shí)會(huì)報(bào)錯(cuò)。

啟動(dòng)數(shù)據(jù)庫(kù)

完成上述配置后就可以啟動(dòng)數(shù)據(jù)庫(kù)了扭仁,在bin目錄下執(zhí)行mongod命令

./mongod -f ../conf/mongod.conf

-f指定數(shù)據(jù)庫(kù)啟動(dòng)時(shí)加載的配置文件(實(shí)際上如果沒(méi)有配置文件可缚,可以直接在mongod后面跟上參數(shù)也可以,但不如配置文件方便斋枢,可以使用./mongod -h命令查看具體有哪些參數(shù))

這樣一個(gè)數(shù)據(jù)庫(kù)實(shí)例就啟動(dòng)成功了帘靡,如果有錯(cuò)誤會(huì)顯示在控制臺(tái)上,請(qǐng)檢查配置文件是否正確瓤帚。

連接數(shù)據(jù)庫(kù)

數(shù)據(jù)庫(kù)啟動(dòng)好之后就可以使用客戶端進(jìn)行連接了描姚。MongoDB官方自帶了一個(gè)客戶端工具,就是上面提到的mongo命令戈次。繼續(xù)在bin目錄下執(zhí)行

./mongo./mongo 127.0.0.1:27017

不帶ip和端口號(hào)轩勘,默認(rèn)會(huì)連127.0.0.1:27017。默認(rèn)會(huì)連接到test數(shù)據(jù)庫(kù)怯邪,連接成功后绊寻,顯示如下消息

MongoDB shell version: 3.0.6
connecting to: test
>

并顯示操作數(shù)據(jù)庫(kù)的命令提示符,以后就可以在這里通過(guò)命令來(lái)操作數(shù)據(jù)庫(kù)了。mongo shell提供了很多方法(可以參考mongo Shell Methods)澄步,這里可以輸入help查看可以使用哪些方法冰蘑。

使用命令操作數(shù)據(jù)庫(kù)

  1. 使用show dbs可以列出當(dāng)前有哪些數(shù)據(jù)庫(kù)

     > show dbs
     local  0.078GB
    

    目前只顯示出一個(gè)local數(shù)據(jù)庫(kù),這是MongoDB自帶的村缸,雖然我們連的是test數(shù)據(jù)庫(kù)祠肥,可test沒(méi)有數(shù)據(jù)因此不顯示出來(lái)

  2. 在test數(shù)據(jù)庫(kù)中添加一個(gè)user集合,并插入一條數(shù)據(jù)梯皿,結(jié)果返回WriteResult對(duì)象仇箱,包括影響的記錄數(shù)

     > db.user.insert({name:"張三",age:14})
     WriteResult({ "nInserted" : 1 })
    

    user集合不需要提前創(chuàng)建,我們?cè)偬砑右粭l數(shù)據(jù)东羹,這次增加一個(gè)字段

     > db.user.insert({name:"李四",age:15,address:"北京"})
     WriteResult({ "nInserted" : 1 })
    

    雖然多了個(gè)字段剂桥,依然能存進(jìn)去,這說(shuō)明MongoDB的可擴(kuò)展性很強(qiáng)属提。隨著項(xiàng)目的進(jìn)行渊额,業(yè)務(wù)變得復(fù)雜,剛開(kāi)始定義的字段不夠用了垒拢,需要擴(kuò)展字段,使用MongoDB的話就無(wú)需修改表結(jié)構(gòu)求类。關(guān)于insert方法詳細(xì)介紹http://docs.mongodb.org/manual/tutorial/insert-documents/奔垦。

    再次查詢有哪些數(shù)據(jù)庫(kù),這時(shí)就會(huì)顯示出test數(shù)據(jù)庫(kù)了尸疆。

     > show dbs
     local  0.078GB
     test   0.078GB
    
  3. 查詢剛才添加的數(shù)據(jù)

     > db.user.find()
     { "_id" : ObjectId("561923d311f16927acb1ff79"), "name" : "張三", "age" : 14 }
     {"_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
    

    返回的數(shù)據(jù)中_id是在插入數(shù)據(jù)時(shí)MongoDB自動(dòng)加入的主鍵椿猎,find方法可以傳入過(guò)濾條件,如:db.user.find({name:"張三"})寿弱,這樣就只返回name是張三的數(shù)據(jù)了犯眠。關(guān)于find方法詳細(xì)介紹http://docs.mongodb.org/manual/tutorial/query-documents/

  4. 更新一條數(shù)據(jù)

     > db.user.update({name:"張三"},{$set:{age:20}})
     WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
     > db.user.find()
     { "_id" : ObjectId("561923d311f16927acb1ff79"), "name" : "張三", "age" : 20 }
     { "_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
    

    使用update方法更新張三的年齡為20症革,update方法接收了兩個(gè)參數(shù)筐咧,第一個(gè)參數(shù)作用類似于sql中的where條件,第二個(gè)參數(shù)用于修改具體的字段噪矛,$set是MongoDB內(nèi)置的修改器量蕊。MongoDB還提供其他修改器,詳情可以參見(jiàn)https://docs.mongodb.org/manual/reference/operator/update/艇挨。

    注意残炮,這里的更新操作只會(huì)作用匹配到得第一條數(shù)據(jù)上,只會(huì)更新一條數(shù)據(jù)缩滨,如果有兩個(gè)張三的話势就,那么第二條數(shù)據(jù)就不會(huì)更新泉瞻,如果要更新多條數(shù)據(jù),需要在update方法傳入第三個(gè)參數(shù){ multi: true }苞冯,update方法還可以接收其他參數(shù)袖牙,具體可以參見(jiàn)http://docs.mongodb.org/manual/tutorial/modify-documents/

  5. 刪除數(shù)據(jù)

     > db.user.remove({name:"張三"})
     WriteResult({ "nRemoved" : 1 })
     > db.user.find()
     { "_id" : ObjectId("561a475611f16927acb1ff7a"), "name" : "李四", "age" : 15, "address" : "北京" }
    

    使用remove方法刪除張三的數(shù)據(jù)抱完,remove方法接收一個(gè)參數(shù)贼陶,該參數(shù)作用類似于sql中where條件刃泡,如果要?jiǎng)h除user中所有的數(shù)據(jù)巧娱,則使用db.user.remove({}),如果要?jiǎng)h除user集合烘贴,則使用db.user.drop()方法禁添,刪除詳情可以參見(jiàn)http://docs.mongodb.org/manual/tutorial/remove-documents/

開(kāi)啟認(rèn)證

  1. 進(jìn)入admin數(shù)據(jù)庫(kù)桨踪,創(chuàng)建root用戶

     > use admin
    
     > db.createUser( {
     user: "用戶名",
     pwd: "密碼",
     roles: [ { role: "root", db: "admin" } ]
     });
    
     > exit
    
  2. 修改mongod.conf中認(rèn)證配置authorization: enabled

  3. 重啟數(shù)據(jù)庫(kù)

    使用ps -ef | grep mongod命令老翘,打印出MongoDB的后臺(tái)進(jìn)程,得到該進(jìn)程的pid锻离,再使用kill -15 pid殺掉進(jìn)程铺峭,再啟動(dòng)MongoDB數(shù)據(jù)庫(kù),此時(shí)再使用mongo命令連接上數(shù)據(jù)庫(kù)后汽纠,無(wú)法進(jìn)行任何增刪改查操作卫键。

  4. 登錄認(rèn)證

     > use admin
     
     > db.auth("用戶名","密碼"); 
    

    之后就可以順利操作了。

結(jié)束

我也剛接觸MongoDB沒(méi)多久虱朵,我覺(jué)得MongoDB上手還是很簡(jiǎn)單的莉炉,把我學(xué)習(xí)的過(guò)程總結(jié)下來(lái)分享給大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碴犬,一起剝皮案震驚了整個(gè)濱河市絮宁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌服协,老刑警劉巖绍昂,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異偿荷,居然都是意外死亡治专,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)遭顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)张峰,“玉大人,你說(shuō)我怎么就攤上這事棒旗〈” “怎么了撩荣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饶深。 經(jīng)常有香客問(wèn)我餐曹,道長(zhǎng),這世上最難降的妖魔是什么敌厘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任台猴,我火速辦了婚禮,結(jié)果婚禮上俱两,老公的妹妹穿的比我還像新娘饱狂。我一直安慰自己,他們只是感情好宪彩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布休讳。 她就那樣靜靜地躺著,像睡著了一般尿孔。 火紅的嫁衣襯著肌膚如雪俊柔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天活合,我揣著相機(jī)與錄音雏婶,去河邊找鬼。 笑死白指,一個(gè)胖子當(dāng)著我的面吹牛留晚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侵续,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倔丈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了状蜗?” 一聲冷哼從身側(cè)響起需五,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轧坎,沒(méi)想到半個(gè)月后宏邮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缸血,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蜜氨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捎泻。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飒炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笆豁,到底是詐尸還是另有隱情郎汪,我是刑警寧澤赤赊,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站煞赢,受9級(jí)特大地震影響抛计,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜照筑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一吹截、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凝危,春花似錦波俄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咏花。三九已至趴生,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昏翰,已是汗流浹背苍匆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棚菊,地道東北人浸踩。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像统求,于是被迫代替她去往敵國(guó)和親检碗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)码邻。由C++語(yǔ)言編寫(xiě)折剃。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方...
    入戲半分笑閱讀 375評(píng)論 0 2
  • 安裝 MongoDB Windowns、Ubuntu17.10 下安裝 MongoDB教程在此 MongoDB 幫...
    Kangvcar閱讀 2,091評(píng)論 0 13
  • 第一章 前言 1.1 知識(shí)體系分析 前端工程師:Web前端像屋,也就是在Web應(yīng)用中用戶可以看得見(jiàn)碰得著的東西怕犁。包括W...
    whitsats閱讀 866評(píng)論 0 3
  • 前言 NoSQL 非關(guān)系數(shù)據(jù)庫(kù)。MongoDB is an open-source, document datab...
    進(jìn)擊的前端閱讀 551評(píng)論 0 1
  • ###MongoDB是什么己莺? MongoDB是一種強(qiáng)大奏甫,靈活,可擴(kuò)展的存儲(chǔ)方式凌受。與關(guān)系型數(shù)據(jù)庫(kù)不同阵子,它是一種面向文...
    明ming閱讀 1,680評(píng)論 0 2