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 | db.pets.insertMany([ |
刪除資料庫
#在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步驟
先移動到admin DB下操作
創建管理所有DB的管理帳號(最一開始需要的帳號)
db.createUser({user: "asd1234",pwd: "zxc1234",roles: [{ role: "root", db: "admin" }]})
- 再啟動MongoDB時開啟認證
mongod --auth
之後使用mongo進去就看不到所有資料庫狀態了
一開始沒輸入帳號進去想登入管理者帳號就要移動到admin下使用語法:
db.auth("root", "PASSWORD")
在使用MongoDB的Shell開始就登入的語法:
連接Port預設27017,遠端開放要改
mongo -u 使用者帳號 -p 使用者密碼 --port 連接Port
能對不同資料庫增加不同使用者並設定權限
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