MongoDB入門手冊

前言

照慣例在文章開頭放個圖片

作為近幾年開始熱門討論的 NoSQL資料庫,有非常強大的社群及網路討論聲量,本身也有分成安裝版跟免安裝版本,大部分網路上教學都是安裝版,因為有安裝就會有預設路徑 = 少做路徑設定

對於第一次操作的人可能都會是這個表情,這就是學習新技術痛苦的地方啊…

我在操作時使用免安裝版,優點就是可以隨時帶著走,但路徑出錯直接運作不起來

這部分就交給讀者自行選擇版本囉 ~

在學習途中做個資料整理,提供正在學的人能避免做無用功浪費時間,有錯誤歡迎留言指正!


MongoDB設定細節

安裝本機背景服務設定(Windows環境下):

讓MongoDB可以在背景啟動,mongodb.cfg是設定檔,寫法可參考下文所寫格式

mongod --config "C:\你的安裝路徑\bin\mongodb.cfg" --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install

在安裝的時候一起把設定檔讀入就不需要打前面那一大串了

讀取設定檔語法可以參照下面寫的 把設定路徑的部分改成讀取設定檔也行

筆者目前資料夾分布有以下(可自由設定)

#資料庫存放的地方
C:/mongodb/data/db              
#備份存放的地方
C:/mongodb/data/backup        
#日誌檔存放的地方
C:/mongodb/data/log            

安裝成功使用以下可以看到服務啟動的提示,如果沒反應可能有地方打錯就重新安裝一次吧

背景啟動指令:

net start MongoDB

背景關閉指令:

net stop MongoDB

命令提示字元(Cmd)登入MongoDB:

若今天要用 asd1234帳號登入mongoDB存取mongodb,27012是當初設定的port

mongo -u asd1234 -p zxc1234 --port 27012

以下指令可以在mongodb啟動時更改路徑

資料庫存放路徑:

mongod --dbpath=C:\mongodb\data

Log檔案存放路徑:

mongod --logpath=C:\mongodb\log\mongod.log

讀取設定檔案路徑:

mongod --config "C:\mongodb\bin\mongod.cfg"

mongod.cfg格式(注意縮排與空格):

  storage:           #DB存放設定
      dbPath: C:\mongodb\data\db
      journal:    
        enabled: true
  systemLog:           #日誌檔存放設定
      destination: file
      logAppend: true 
      path: C:\mongodb\log\mongod.log
  security:
     authorization: enabled
  net:
     port: 27123        #綁定的PORT
     bindIp : 0.0.0.0   #允許遠端的所有IP

MongoDB指令整理

<> 、{} => 表示名稱,省略不打

資料庫操作

#顯示目前所在資料庫
db                                                
#檢視所有資料庫
show  dbs                                    
#檢視所有使用者
show  users                                 
#切換資料庫,原本沒有會自己新建一個,空DB不會顯示在檢視
use <DB名稱>                             
#檢視DB裡面的table,也能稱collection
show tables/collections                
#顯示table資料筆數
db.<table名稱>.count()                

插入資料

#創建table,不過直接在插入資料時直接寫也行
db.createCollection("table名稱")  

#AND語法
db.{collection名稱}.find({"欄位名稱":"資料內容", "欄位名稱":"資料內容"}).pretty()
#OR語法
db.{collection名稱}.find({$or: [{"欄位名稱":"資料內容"}, {"欄位名稱":"資料內容"}]}).pretty()
#兩者組合
db.{collection名稱}.find({"欄位名稱":{$gt:50},$or:[{"欄位名稱":"資料內容"},{"欄位名稱":"資料內容"}]}).pretty()

以下對 ({要插入的資料內容篩選條件}) 符號說明

#等於50
"by":"50"         
#小於50
"欄位名稱":{$lt:50}    
#小於等於50    
"欄位名稱":{$lte:50}  
#大於50
"欄位名稱":{$gt:50}   
 #大於等於50
"欄位名稱":{$gte:50} 
 #不等於
"欄位名稱":{$ne:50}  

若碰上要一次插入多筆資料的情況

[ ] → 多筆資料包起來,每筆資料逗號分隔

“ “ → 欄位名稱跟內容沒有也能插資料,通常是只有內容有 “ “

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
db.pets.insertMany([
{

"name" : "Daisy",

"species" : "cat",

"breed" : "calico"

},
{
"name":"Bella",

"species":"dog",

"breed":"australian shepard"
}
])

刪除資料庫

#在DB底下操作才能刪除該資料庫
db.dropDatabase()   
#刪除table
db.<table名稱>.drop()   
#找到table有包含到該內容就刪除
db.<table名稱>.remove({欄位名稱 : 欄位內容,...})  
#全刪除
db.<table名稱>.remove()   

搜尋資料庫內容

#回傳第一筆資料
db.<table名稱>.findOne()   
#回傳全部資料,pretty是讓顯示有間距好看
db.<table名稱>.find().pretty()  

資料庫內容更新

db.<table名稱>.update({name:"MongoDB",其他欄位:欄位內容...},{$set:{name:"Jack",其他欄位:欄位內容...}},{multi:true})

{name:"MongoDB",其他欄位:欄位內容...}:要更新的資料
{$set:{name:"Jack",其他欄位:欄位內容...}}:從舊資料找符合內容的目標
{multi:true}:若要一次更新多筆要true

資料庫備份

指令如下

mongodump -h 127.0.0.1 --port 27120 -u root -p root1234 -d Number -o C:/mongodb/data/backup --authenticationDatabase admin

參數說明:

#host,表示資料庫主機的IP位置或是電腦名稱
-h        
#user,登入的帳號
-u         
#password,登入的密碼
-p         
#指定port號
--port     
#database,備份資料庫的名稱
-d         
#collection,指定備份某一個Collection
-c         
 #output備份輸出的磁碟位置(Folder Path) 要備份在哪個磁碟要打不然會在奇怪地方
-o        
#開啟授權的資料庫需要加上否則無法使用
--authenticationDatabase admin 

備份前最好先移動到 mongoDB 的 admin 資料庫下面

使用以下指令
#磁碟同步與上鎖
db.runCommand({fsync:1,lock:1})
#查看上鎖狀態 fsyncLock true 代表成功
db.currentOp()
#備份完成記得解鎖
db.fsyncUnLock()

資料庫還原

指令如下

mongorestore -h 127.0.0.1 --port 27120 -d Number -u root -p root1234 --authenticationDatabase admin --dir C:/mongodb/data/backup/Number --drop

#host,表示資料庫主機的IP位置或是電腦名稱
-h         
#user,登入的帳號
-u         
#password,登入的密碼
-p         
#指定port號
--port
#database,備份資料庫的名稱
-d        
#備份DB的磁碟位置(Folder Path) 要備份在哪個磁碟要打不然會在奇怪地方
-dir     
 #開啟授權的資料庫需要加上否則無法使用
--authenticationDatabase admin
#若Server有相同DB會先刪除再還原回去(因有相同名稱不能還原),小心使用    
--drop  

MongoDB遠端連線

沒有設定Auth沒辦法開放給其他電腦使用

設定Auth步驟

  1. 先移動到admin DB下操作

  2. 創建管理所有DB的管理帳號(最一開始需要的帳號)

db.createUser({user: "asd1234",pwd: "zxc1234",roles: [{ role: "root", db: "admin" }]})

  1. 再啟動MongoDB時開啟認證

mongod --auth

  1. 之後使用mongo進去就看不到所有資料庫狀態了

    一開始沒輸入帳號進去想登入管理者帳號就要移動到admin下使用語法:

db.auth("root", "PASSWORD")

在使用MongoDB的Shell開始就登入的語法:

連接Port預設27017,遠端開放要改

mongo -u 使用者帳號 -p 使用者密碼 --port 連接Port

  1. 能對不同資料庫增加不同使用者並設定權限

    db.createUser({user: "使用者名稱",pwd: "密碼",roles: [{ role: "root/readWrite/read", db: "資料庫名稱" }]})

    • root #最大
    • read #只能讀
    • readWrite #能讀寫

補充用戶設定的相關指令
#更新用戶權限
db.updateUser(user, writeConcern)
#在DB的 test 下創使用者
db.createUser({ user:”asd1234”, pwd:”zxc1234”, roles:[“readWrite”, “dbAdmin”] })
#遠端連線( / 為二選一)
mongo [IP] / [database] -u username -p password

權限補充說明(部分):

dbAdmin
在指定DB中執行管理函數,如創建删除和查看資料表
userAdmin
可以在系統的users集合寫入,找指定DB創建删除和管理使用者
clusterAdmin
只在admin中可用,給使用者所有分片和複製集相關函數的管理權限
readAnyDatabase
只在admin中可用,給使用者所有DB的讀取權限
readWriteAnyDatabase
只在admin中可用,給使用者所有DB的讀寫權限 

Auth可能會發生的問題

若直接從設定檔開啟授權會導致無法遠端連線

要針對個別DB設置使用者再透過指令授權連線

#修改密碼
db.changeUserPassword("user123","password456")           
#刪除帳戶
db.dropUser("user123")   

遠端電腦連線mongoDB

指令如下

mongo "mongodb://mongodb.test.com:連線的port"
mongo --host mongodb.test.com:連線的port
mongo --host mongodb.test.com --port 連線的port

參數說明
#連線地址(如mongodb.test.com ,也可以是 IP位置)
–host

舉個例子
,使用者 root連線至admin DB使用

[ ]請依情況變化

mongo --host [192.168.xx.xxx] --port [27120] -u ["root"] -p --authenticationDatabase ["admin"]

MongoDB在 Centos 7環境操作

有時無法啟動檢查相關資料夾是否存在去看log檔案檢查是否為權限問題

更改Port很容易出現的問題

#如果不存在才新增沒有的資料夾
sudo mkdir /var/lib/mongodb                                
#設定資料夾權限  mongo為使用者名稱
sudo chown -R mongo:mongo /var/lib/mongodb   
#重設權限給mongod  改port 後就好了
sudo chown -R mongod:mongod /var/lib/mongo    

沒設定授權用預設端口容易入侵被改內容

#啟動Mongodb
sudo service mongod start  /   systemctl start mongod.service    
#重啟Mongodb
sudo service mongod restart
#關閉Mongodb
sudo service mongod stop      
#查看目前狀態
systemctl status mongod.service 

如何正確關閉mongoDB
1. mongo
2. use admin
3. db.shutdownServer()

如果以上指令還是無法解決就是重裝,重裝解決95%問題👌
#卸載MongoDB
sudo yum erase $(rpm -qa | grep mongodb-org)
#刪除 log
sudo rm -r /var/log/mongodb
#對MongoDB設定檔修改
nano /etc/mongod.conf
→ 要開關帳號權限進去改完存檔重新啟動MongoDB

開放對外的端口方法:
#查看防火牆狀態
systemctl status firewalld
#防火牆重載
firewall-cmd –reload
#開放PORT狀態 YES成功
firewall-cmd –zone=public –query-port=27017/tcp
#開放MongoDB PORT
firewall-cmd –zone=public –add-port=27017/tcp –permanent

MongoDB Cloud服務

MongoDB Atlas 學術用512MB,官方近幾年在推的,我用過後覺得容量太小,有興趣可以參考

網誌在這 → MongoDB Atlas

參考資料