---
tags: Node.js 直播班 - 2023 春季班
---
# 第一週 mongoDB 資料庫教學
## 開課提醒
1. 錄影
2. [每日任務挑戰列表](https://rpg.hexschool.com/training/34/show?embedhm=mp7_fvnlRFm-m14hEySetQ)
3. [Adobe XD 設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/grid)
4. 在 discord 分享一個開會議題
## mongoDB 資源
1. [mongoDB 簡報](https://whimsical.com/mongodb-FCuHtC9DW1SHqRWBKsJKp1)
2. [Adobe XD 設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/)
## 前置環境安裝
* [mongo 安裝](https://www.mongodb.com/try/download/community)
* [compass 安裝](https://www.mongodb.com/try/download/compass)
## 以旅館訂房網來說明([簡報](https://whimsical.com/mongoose-YKTKL5aF4pHQbkemgQTMZH))
* 透過 excel 與學員來講解 mongoDB
* rooms、users
## 如何開啟一個 mongo 資料庫,預設開啟 :27017 port
1. 新增 data 與 log 資料夾
2. 指行指令:`mongod --dbpath "data 資料夾"`
3. 若要有 log: `mongod --dbpath "DB資料夾路徑" --logpath "LOG資料夾路徑/mongo.log"`
```
mongo 與 mongod 指令差異
1. mongod:server 端開啟伺服器應用
2. mongo: 客戶端,直連造訪您開啟的 server 應用
MAC 可開設活動監視器觀看
```
## 常見指令
## 資料庫顯示
- 顯示資料庫:show dbs
- 切換資料庫:use `資料庫名稱`
- 觀看指令資料庫裡面的集合:show collections
### 新增一筆資料 insertOne
```jsx
db.rooms.insertOne(
{"name":"單人房","price":1000,"rating":4.5}
)
```
### 新增多筆資料 insertMany
```jsx
db.rooms.insertMany(
[
{
"rating": 4.3,
"price": 1500,
"name": "豪華單人房"
},
{
"rating": 4.8,
"price": 2000,
"name": "雙人房"
}
]
)
```
## 中場休息
> 洧杰 NOTE:刪除既有 compass 資料
### 尋找集合裡面的資料 db.collections.find()
```
## 一般搜尋
- db.集合名稱(collections name).find()
- 尋找對應屬性:db.collections.find({屬性名稱:屬性值})
- 模糊搜尋:db.rooms.find({"name":/雙/})
- 數值區間:db.collections.find({屬性名稱:{$gt:400}})
- 複合條件:db.collections.find({屬性名稱:{$gt:400},rating:{$gte:4.4}})
## 常用語法
- project 保護欄位:db.rooms.find({"name":/雙/},{"_id":0})
- 搜尋陣列裡面的值:db.rooms.find({"payment":{$in:["信用卡"]}})
```
| $eq | 等於 |
| --- | --- |
| $ne | 不等於 |
| $gt | 大於 |
| $lt | 小於 |
| $gte | 大於等於 |
| $lte | 小於等於 |
| $in | 存在某個值 |
| $nin | 不存在某個值 |
邏輯運算子:or 或 and
- `$or:find({$or:[{},{}]})`
```=javascript
db.rooms.find(
{ $and:
[
{price:{$lte:1500}},
{rating:{$gte:4.5}}
]
}
)
```
## 修改 updateOne
`replaceOne()`,只能替換整個文件,`updateOne()`則允許更新欄位。
```jsx
db.rooms.updateOne(
{"_id":ObjectId("621edf99a20aa7506a116f9a")}
,{$set:{name:"修改雙人房"}})
```
### 修改多個值 [updateMany](https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/)(filter 篩選 >$set 更換設定)
```jsx
db.rooms.updateMany(
{rating:{$gt:4.5}},
{$set:{price:300}}
)
```
### 替換整個文檔:replaceOne、replaceMany
**db.collection.replaceOne(filter, replacement, options)**
```jsx
db.rooms.replaceOne(
{"_id":ObjectId("621edf99a20aa7506a116f9a")},
{name:"yes~"})
```
### 刪除多個文件:deleteMany(filter)
刪除全部:`db.rooms.deleteMany()`
```jsx
db.rooms.deleteMany(
{
rating:{$gte:4.3}
})
```
## driver 介紹
1. [mongoDB 官方文件](https://www.mongodb.com/docs/drivers/)
2. [.NET Core](https://docs.microsoft.com/zh-tw/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-6.0&tabs=visual-studio)
3. [Node.js NPM Mongoose](https://mongoosejs.com/docs/api/model.html#model_Model.findOne)
## 資料集
``` =JavaScript
[
{
"rating": 4.5,
"price": 1000,
"name": "標準單人房",
"payment":["信用卡","ATM"]
},
{
"rating": 4.3,
"price": 1500,
"name": "豪華單人房",
"payment":["信用卡","ATM"]
},
{
"rating": 4.8,
"price": 2000,
"name": "標準雙人房",
"payment":["信用卡","ATM"]
},
{
"rating": 4.7,
"price": 2500,
"name": "豪華雙人房",
"payment":["ATM"]
},
{
"rating": 4.0,
"price": 3000,
"name": "標準四人房",
"payment":["現金"]
},
{
"rating": 3.5,
"price": 10000,
"name": "總統套房",
"payment":["現金"]
}
]
```
## 本堂作業
* [chatGPT 解法](https://sharegpt.com/c/qhd97jP)
#### 前置作業
1. 請建立一個 database,並建立一個 `posts` collection
2. 將此 [JSON 資料](https://drive.google.com/file/d/1VCuWX2M6K-Du8pWlrcGImO_ux4Zwsa6v/view?usp=sharing),透過 Compass 倒入到 `posts` collection
貼文集合欄位介紹
- name:貼文姓名
- image:貼文圖片
- content:貼文內容
- likes:按讚數
- comment:留言數
- createdAt:發文時間
- type:貼文種類\[fan(粉絲)、group(社團)\]
- tags:貼文標籤
### **主線任務**
1. 根據此 [HackMD](https://hackmd.io/@hexschool/HJOX15NZ9),依照題目敘述寫出相關操作指令
2. 將 todolist kata 再練三遍,總計六遍後,最後一次練習花多久時間?
### **作業分享**
1. 作業:請提供 **HackMD** 連結,並回報到此 [Discord](https://discord.com/channels/801807326054055996/1073411249926324234/1088021845825032214) 作業分享區
2. 分享最後 todolist 練習時間是多久,是否有練三遍?(選作)