---
title: MongoDB
tags: MongoDB
date: 2021/9/6
---
###### tags: `MongoDB`
###### *date: 2021/9/4*
# MongoDB
[TOC]
## 前言
在製作自己的專案時,想讓專案更加完整,於是就開始想,既然前端畫面邏輯都自己開發了,現在網路上資源又那麼豐富,未來也有可能朝全端發展,何不自己架設後端 API,給自己串接,還能了解整個網頁的運作邏輯,於是開始自學了後端框架 Express 和資料庫 MongoDB,這裡將會記錄學習 MongoDB 的學習筆記。
## 介紹
### 資料庫
- 關聯式資料庫(RDBMS)
- 資料具有關聯性
- 表格化、標準化
- 如:MySQL
- 非關聯式資料庫(Not only SQL)
- 更加彈性化(不一定要使用 SQL)
- 如:MongoDB
- SQL 是什麼?
- SQL 是**結構化查詢語言**
- 所有的關聯式資料庫都是用 SQL
- 會 SQL 就大致上能快速學會關聯式資料庫(每個資料庫還是有些微的不同)
### MongoDB
- 是快速開發 Web 而設計的資料庫
- 極簡、靈活性高
- 存取的是各式各樣的 BSON。
- BSON 就是二進制的 JSON。
- MongodDB 可以有多個資料庫
- database 為資料庫,存放多個集合
- collection 集合,存放多個文件
- document 文件,我們操作的部分
## MongoDB 安裝 與 啟動
### 安裝 MongoDB
可以去官網依自己的作業系統下載。
建議安裝版本為偶數結尾(穩定版)。
[官網下載網站](https://docs.mongodb.com/manual/administration/install-community/)
==注意==:安裝建議用使用預設的比較不容易出錯,自訂的話,路徑不能有中文。
### 設置環境變數
我這裡是安裝 Windows 的 MongoDB 5.0 版本
1. 找到安裝 MongoDB 的資料夾,直到找到裡面的 bin 資料夾
範例:`C:\Program Files\MongoDB\Server\5.0\bin`
2. 開啟電腦的環境變數,對使用者變數裡面的 PATH 編輯,並把剛剛 bin 的路徑新增到 PATH 內(需注意不要動到裡面其他的路徑)
以我 Windows 10 為例:
打開我的電腦 > 開啟設定 > 開啟進階系統設定 > 系統內容進階 tag 內點環境變數 > 對 PATH 進行編輯
3. 在 C:\ 根目錄新增 data 資料夾,裡面新增 db 資料夾。
4. 開啟 CMD 輸入 `Mongod` 啟動服務器後縮小
5. 再開啟另一個 CMD 輸入 `Mongo` 連接資料庫,連接成功 CMD 會出現 `>`
### 開機自動啟動服務器
1. 在 MongoDB 版本那個資料夾新增`mongod.cfg`檔案
如:`C:\Program Files\MongoDB\Server\5.0`新增`mongod.cfg`
2. 在`mongod.cfg`內輸入設定
```cfg
systemLog:
destination: file
path: c:\data\log\mongod.log # 這裡輸入 log 檔案
storage:
dbPath: c:\data\db # 這裡輸入資料要存的位置
net:
port: 27017 # 這裡輸入想要的 port 號
```
3. 開啟系統管理員身分的 CMD 在 **bin 資料夾** 輸入 `mongod.exe --config`
4. 在 **資料存取位置** 輸入 `god.cfg --install`
5. 接著輸入 `net start MongoDB` 啟動服務器
### 圖形化工具安裝
除了使用 CMD 來操作 MongoDB 外,也有圖形化工具可以使用
[下載圖形化工具網站](https://www.mongodbmanager.com/download)
## 增刪改查資料庫
使用 `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} })`
假設想查詢 price < 90 或 price > 100 的資料,條件變成要先設定`$or`,並使用陣列劃分條件
範例:`db.<collection>.find({$or: [{price: {$lt: 90} }, {price: {$gt: 100} }])`
假設想查詢前 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 如果資料內有一樣的資料不會添加,沒有則會添加。
#### 想運算修改資料內的數字
如果資料內物品價格為 10 元
想漲價 10 元,使用`$inc`
`db.<collection>.update({查詢物品}, {$inc: {price: 10} })`
### 刪除資料
`db.<collection>.remove(查詢條件)`
`db.<collection>.deleteMany(查詢條件)`
刪除符合條件的多筆資料
`db.<collection>.remove(查詢條件, true)`
`db.<collection>.deleteOne(查詢條件)`
刪除符合條件的第一筆資料
### 排列資料庫
資料庫默認情況下是使用`_id`來進行排列,可以使用 `sort({})` 來指定排序,1 為升序, -1 為降序。
如果想讓 price 由小到大升序,請看以下範例:
`db.<collection>.find(查詢條件).sort({price: 1})`
如果想讓 price 由大到小降序,請看以下範例:
`db.<collection>.find(查詢條件).sort({price: -1})`
### 參考資料
- [Day17 - MongoDB 安裝設定](https://ithelp.ithome.com.tw/articles/10186324)
- [MongoDB 入門教學影片](https://www.youtube.com/watch?v=Q9r8guQo58k&list=PLmOn9nNkQxJGX-finJqCSVVZx3gwn4Rga)
- [MongoDB MANUAL](https://docs.mongodb.com/manual/)