#前言
在製作自己的專案時,想讓專案更加完整,於是就開始想,既然前端畫面邏輯都自己開發了,現在網路上資源又那麼豐富,未來也有可能朝全端發展,何不自己架設後端 API,給自己串接,還能了解整個網頁的運作邏輯,於是開始自學了後端框架 Express 和資料庫 MongoDB,這裡將會記錄學習 MongoDB 的學習筆記。
#介紹
#資料庫
- 關聯式資料庫(RDBMS)
- 資料具有關聯性
- 表格化、標準化
- 如:MySQL
- 非關聯式資料庫(Not only SQL)
- 更加彈性化(不一定要使用 SQL)
- 如:MongoDB
- SQL 是什麼?
- SQL 是結構化查詢語言
- 所有的關聯式資料庫都是用 SQL
- 會 SQL 就大致上能快速學會關聯式資料庫(每個資料庫還是有些微的不同)
#MongoDB
- 是快速開發 Web 而設計的資料庫
- 極簡、靈活性高
- 存取的是各式各樣的 BSON。
- BSON 就是二進制的 JSON。
- MongodDB 架構 可以有多個資料庫
- database 為資料庫,存放多個集合
- collection 集合,存放多個文件
- document 文件,我們操作的部分
- collection 集合,存放多個文件
- database 為資料庫,存放多個集合
#MongoDB 安裝 與 啟動
#安裝 MongoDB
可以去官網依自己的作業系統下載。 建議安裝版本為偶數結尾(穩定版)。 官網下載網站
==注意==:安裝建議用使用預設的比較不容易出錯,自訂的話,路徑不能有中文。
#設置環境變數
我這裡是安裝 Windows 的 MongoDB 5.0 版本
-
找到安裝 MongoDB 的資料夾,直到找到裡面的 bin 資料夾 範例:
C:\Program Files\MongoDB\Server\5.0\bin
-
開啟電腦的環境變數,對使用者變數裡面的 PATH 編輯,並把剛剛 bin 的路徑新增到 PATH 內(需注意不要動到裡面其他的路徑) 以我 Windows 10 為例: 打開我的電腦 > 開啟設定 > 開啟進階系統設定 > 系統內容進階 tag 內點環境變數 > 對 PATH 進行編輯
-
在 C:\ 根目錄新增 data 資料夾,裡面新增 db 資料夾。
-
開啟 CMD 輸入
Mongod
啟動服務器後縮小 -
再開啟另一個 CMD 輸入
Mongo
連接資料庫,連接成功 CMD 會出現>
#開機自動啟動服務器
-
在 MongoDB 版本那個資料夾新增
mongod.cfg
檔案 如:C:\Program Files\MongoDB\Server\5.0
新增mongod.cfg
-
在
mongod.cfg
內輸入設定複製成功!systemLog: destination: file path: c:\data\log\mongod.log # 這裡輸入 log 檔案 storage: dbPath: c:\data\db # 這裡輸入資料要存的位置 net: port: 27017 # 這裡輸入想要的 port 號
-
開啟系統管理員身分的 CMD 在 bin 資料夾 輸入
mongod.exe --config
-
在 資料存取位置 輸入
god.cfg --install
-
接著輸入
net start MongoDB
啟動服務器
#圖形化工具安裝
除了使用 CMD 來操作 MongoDB 外,也有圖形化工具可以使用 下載圖形化工具網站
#操作資料庫
使用 use <database>
新增並進入資料庫
如:use test
當你新增資料時,<collection>
為你的集合名。
如:db.students.insert({ name: "毛毛", gender: "男"})
這時資料庫就會自動新增 students 這個集合,
這個集合裡面有個{ name: "毛毛", gender: "男"}
的資料,
輸入show collection
就可以看到 students
輸入show dbs
就可以看到資料庫名稱 test
想刪除集合,只要輸入db.students.drop()
就會刪除集合。
想刪除當前所在的資料庫,只要輸入db.dropDatabase()
#新增資料
db.<collection>.insert(資料)
可以新增 JSON 資料,一個資料傳物件,多個資料傳陣列。
新增後如果沒有自訂_id
值的話,MongoDB 會自動生成 _id
,確保每個資料都是唯一性。
db.<collection>.insertOne()
只能傳一個物件。
db.<collection>.insertMany()
只能傳一個陣列。
#查詢資料
db.<collection>.find(條件)
可以傳物件,當作查詢集合的參考,返回陣列。
如:傳{}
就會顯示所有資料
db.<collection>.findOne()
返回第一個查到的物件。
db.<collection>.find().count()
返回查詢的數量。(length()一樣)
#如果想加入條件
假設想查詢 price > 100 的資料,條件加上 $gt
範例:db.<collection>.find({price: {$gt: 100} })
假設想查詢 price >= 100 的資料,條件加上 $gte
範例:db.<collection>.find({price: {$gte: 100} })
假設想查詢 price < 100 的資料,條件加上 $lt
範例:db.<collection>.find({price: {$lt: 100} })
假設想查詢 90 < price < 100 的資料,條件之間加上,
範例:db.<collection>.find({price: {$lt: 100, $gt: 90} })
假設想查詢前 10 筆資料,使用 limit(數量)
範例:db.<collection>.find().limit(10)
假設想查詢第 11 ~ 20 筆資料,使用 limit(數量)
外,還要使用skip(跳過幾筆)
範例:db.<collection>.find().skip(10).limit(10)
#更新資料
db.<collection>.update(查詢條件, 更新資料)
透過第一個參數查詢到第一筆資料,第二個參數默認情況下會直接取代原有資料。
#修改資料
db.<collection>.update(查詢條件, { $set: {更新資料} })
第二個參數增加 $set 修改操作符,就可以合併資料,而不是取代。
db.<collection>.update(查詢條件, { $unset: {刪除資料} })
第二個參數改成 $unset 修改操作符,就可以把資料指定屬性刪除。
#修改多筆資料
db.<collection>.updateMany()
update 默認情況只會修改一個資料,可以使用 updateMany 同時修改多筆資料。
db.<collection>.update(查詢條件, { $set: {更新資料} }, { multi: true })
透過傳入第三個參數{ multi: true }
,也可以同時修改多筆資料。
#修改的資料是多層陣列或多層物件
如果資料裡面是陣列或物件,
想修改裡面的屬性就要把操作符換成 $push 或 $addToSet 新增 或 $pop 移除,
查詢條件支持用.
搜尋,但要用引號包起來。
$push 與 $addToSet 的差別在於
- $push 會直接添加。
- $addToSet 如果資料內有一樣的資料不會添加,沒有則會添加。
#刪除資料
db.<collection>.remove(查詢條件)
db.<collection>.deleteMany(查詢條件)
刪除符合條件的多筆資料
db.<collection>.remove(查詢條件, true)
db.<collection>.deleteOne(查詢條件)
刪除符合條件的第一筆資料