MongoDB入門

MongoDB與關系型數據庫對比

MongoDB屬于文檔型的非關系型數據庫,其他像Redis就屬于鍵值對型的非關系型數據庫。對于MongodDB來說它是最接近關系型數據庫的。因此,如果有使用Oracle、Mysql的話,會很快上手MongoDB。

  • 集合:在傳統關系型數據庫中以表(table)的方式組織數據,而在MongoDB中取而代之的是集合(collection),也就是說,在MongoDB數據庫中沒有一張張表,而是一個個集合,集合的作用可以理解為表。

  • 文檔:在傳統關系型數據庫的表中有一行行記錄(row),而在MongoDB中取而代之的是文檔(document),MongoDB是用文檔來表示數據的。文檔的格式類似json的格式,例如,{name:"張三",age:20}

下載

從MongoDB的官網 https://www.mongodb.org/ 上下載對應自己系統的版本,我下載的是最新的穩定版3.0.6。我為了講解需要下載的是解壓版,接下來會一步一步配置數據庫。如果覺得麻煩可以通過軟件源的方式安裝,可以參考Install on Linux

安裝配置

  1. 將下載好的壓縮包解壓,發現有一個bin文件夾,里面有許多命令腳本程序,介紹兩個最常用的,下面演示會用到:

    • mongod: 啟動數據庫用的命令
    • mongo: 作為數據庫的客戶端,去連接本地或遠程的數據庫
  2. 創建一個文件夾作為練習MongoDB的目錄,文件夾的名字任意起個就行,比如叫mongodb,文件夾的位置任意。

  3. 將第一步解壓的bin文件夾復制到第二步創建的mongodb文件夾中,接著在mongodb文件夾里面再創建如下三個文件夾:

    • conf: 啟動數據庫的配置文件會存到這個文件夾里
    • db: 數據庫存儲的位置
    • log: 數據庫日志文件會存到這個文件夾里,順便在log文件夾下新建一個mongodb.log的空文件用來記錄日志
  4. 請在conf文件夾下新建mongod.conf文件,作為啟動數據庫的配置文件。MongoDB 2.6 以前的版本配置文件采用鍵值對的方式配置,使用軟件源安裝的話生成的配置文件就是這種格式,從2.6以后MongoDB采用YAML格式進行配置(當然鍵值對的格式也是可以的,MongoDB的后續版本都兼容鍵值對格式。),本教程將采用YAML格式來配置,其實YAML格式也很簡單(具體可以參考MongoDB官方文檔 http://docs.mongodb.org/manual/reference/configuration-options/)。以下是配置文件內容:

     # 配置數據庫綁定的IP和端口號
     net:
       bindIp: 127.0.0.1
       port: 27017
     
     # 配置數據庫日志的位置,且日志以追加的方式記錄
     systemLog:
       destination: file
       path: /Users/xinyiming/Develop/mongodb/log/mongodb.log
       logAppend: true
     
     # 配置數據庫存儲的位置,journal用于故障恢復,在生產環境下必須開啟
     storage:
       dbPath: /Users/xinyiming/Develop/mongodb/db
       journal:
         enabled: true
     
     # fork配置為true,則數據庫以后臺進程的方式啟動,不會阻塞當前命令窗口。注意windows下沒有這個參數
     processManagement:
       fork: true
     
     # 認證配置,默認是無需用戶名密碼的,如果想開啟認證,必須先在數據庫中添加用戶名、密碼及權限
     security:
       authorization: disabled
    

    以上就是最基本的配置了,#開頭的是注釋,縮進不要用tab,用2到3個空格來縮進,在配置項的:后面有個空格,不然啟動時會報錯。

啟動數據庫

完成上述配置后就可以啟動數據庫了,在bin目錄下執行mongod命令

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

-f指定數據庫啟動時加載的配置文件(實際上如果沒有配置文件,可以直接在mongod后面跟上參數也可以,但不如配置文件方便,可以使用./mongod -h命令查看具體有哪些參數)

這樣一個數據庫實例就啟動成功了,如果有錯誤會顯示在控制臺上,請檢查配置文件是否正確。

連接數據庫

數據庫啟動好之后就可以使用客戶端進行連接了。MongoDB官方自帶了一個客戶端工具,就是上面提到的mongo命令。繼續在bin目錄下執行

./mongo./mongo 127.0.0.1:27017

不帶ip和端口號,默認會連127.0.0.1:27017。默認會連接到test數據庫,連接成功后,顯示如下消息

MongoDB shell version: 3.0.6
connecting to: test
>

并顯示操作數據庫的命令提示符,以后就可以在這里通過命令來操作數據庫了。mongo shell提供了很多方法(可以參考mongo Shell Methods),這里可以輸入help查看可以使用哪些方法。

使用命令操作數據庫

  1. 使用show dbs可以列出當前有哪些數據庫

     > show dbs
     local  0.078GB
    

    目前只顯示出一個local數據庫,這是MongoDB自帶的,雖然我們連的是test數據庫,可test沒有數據因此不顯示出來

  2. 在test數據庫中添加一個user集合,并插入一條數據,結果返回WriteResult對象,包括影響的記錄數

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

    user集合不需要提前創建,我們再添加一條數據,這次增加一個字段

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

    雖然多了個字段,依然能存進去,這說明MongoDB的可擴展性很強。隨著項目的進行,業務變得復雜,剛開始定義的字段不夠用了,需要擴展字段,使用MongoDB的話就無需修改表結構。關于insert方法詳細介紹http://docs.mongodb.org/manual/tutorial/insert-documents/

    再次查詢有哪些數據庫,這時就會顯示出test數據庫了。

     > show dbs
     local  0.078GB
     test   0.078GB
    
  3. 查詢剛才添加的數據

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

    返回的數據中_id是在插入數據時MongoDB自動加入的主鍵,find方法可以傳入過濾條件,如:db.user.find({name:"張三"}),這樣就只返回name是張三的數據了。關于find方法詳細介紹http://docs.mongodb.org/manual/tutorial/query-documents/

  4. 更新一條數據

     > 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方法接收了兩個參數,第一個參數作用類似于sql中的where條件,第二個參數用于修改具體的字段,$set是MongoDB內置的修改器。MongoDB還提供其他修改器,詳情可以參見https://docs.mongodb.org/manual/reference/operator/update/

    注意,這里的更新操作只會作用匹配到得第一條數據上,只會更新一條數據,如果有兩個張三的話,那么第二條數據就不會更新,如果要更新多條數據,需要在update方法傳入第三個參數{ multi: true },update方法還可以接收其他參數,具體可以參見http://docs.mongodb.org/manual/tutorial/modify-documents/

  5. 刪除數據

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

    使用remove方法刪除張三的數據,remove方法接收一個參數,該參數作用類似于sql中where條件,如果要刪除user中所有的數據,則使用db.user.remove({}),如果要刪除user集合,則使用db.user.drop()方法,刪除詳情可以參見http://docs.mongodb.org/manual/tutorial/remove-documents/

開啟認證

  1. 進入admin數據庫,創建root用戶

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

  3. 重啟數據庫

    使用ps -ef | grep mongod命令,打印出MongoDB的后臺進程,得到該進程的pid,再使用kill -15 pid殺掉進程,再啟動MongoDB數據庫,此時再使用mongo命令連接上數據庫后,無法進行任何增刪改查操作。

  4. 登錄認證

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

    之后就可以順利操作了。

結束

我也剛接觸MongoDB沒多久,我覺得MongoDB上手還是很簡單的,把我學習的過程總結下來分享給大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方...
    入戲半分笑閱讀 384評論 0 2
  • 安裝 MongoDB Windowns、Ubuntu17.10 下安裝 MongoDB教程在此 MongoDB 幫...
    Kangvcar閱讀 2,112評論 0 13
  • 第一章 前言 1.1 知識體系分析 前端工程師:Web前端,也就是在Web應用中用戶可以看得見碰得著的東西。包括W...
    whitsats閱讀 875評論 0 3
  • 前言 NoSQL 非關系數據庫。MongoDB is an open-source, document datab...
    進擊的前端閱讀 563評論 0 1
  • ###MongoDB是什么? MongoDB是一種強大,靈活,可擴展的存儲方式。與關系型數據庫不同,它是一種面向文...
    明ming閱讀 1,689評論 0 2