---
tags: Node.js 直播班 - 2022 春季班
---
# 第一週 mongoDB 資料庫教學
## 開課提醒
1. 錄影
2. 點名,[報到]() Code:`bWGyPcLEBgdA`
3. [Adobe XD 設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/grid)
4. 將[書籤]()加入最愛
5. 覆述本課宗旨
6. **學習進度安排([錄影檔]()、[開學典禮]())**
8. [主線任務]()獎品(達四關),[每日任務]()安排
10. 6/11~6/12 小組專題發表會,會找廠商。4月底也會有線下,下週公布。
11. 是否要報名[小組]()?
## 宗旨
秉持六角學院熱於分享的精神,秉持熱心、耐心、同理心為根基,不僅帶領學員掌握前端技術,並提供以學員職涯發展為中心的教學環境。
## 願景
**成為全世界最優質的 Node.js 教學教育單位**
## 義務與責任
1. 六角團隊有責任帶領每位學員,掌握 Node.js 後端技能
2. 六角團隊有義務帶領整體班級,凝聚班級向心力,藉由同濟效應提升學習意願
3. 六角團隊必須考量每位學員的背景,由淺入深地規劃課程內容
4. 六角團隊需為學員設計階段性目標,讓學員能一步步完成任務,進以掌握本門課程技能
## 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 資料庫
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": "雙人房"
}
]
)
```
## 中場休息
* 訂出小組討論時間
* 分享彼此的 JS 程度
* 週六、日上午或下午(規劃分工)
* 週一~五非同步 GitHub Flow 開發
* 或是一組裡面還可以拆成 2 小組
* 還沒看預習的,可以先練習發 GitHub PR 加註解
> 洧杰 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)
```jsx
db.rooms.deleteMany(
{
rating:{$gte:4.3}
})
```
## driver 介紹
1. [mongoDB 官方文件](https://docs.mongodb.com/manual/core/document/)
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":["現金"]
}
]
```
## 主線、週末任務
### 主線任務
* [第一週主線任務連結]()
* [複製用的 HackMD]()
### 週末任務一:極速切版(需開源)
1. 切此份[設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/grid),需選擇以下版本,每位版本限一位,4/10 週日前 23:59:59 前切完 HTML+CSS 全部版型含 RWD
2. 經審核沒問題,並有依照指定項目批改後,贈送 [express](https://www.books.com.tw/products/0010861469) 書籍。請做完後到大廳 tag 洧杰,提交 GitHub Repo、GitHub pages 分享已做完。
* 版本一:純手寫 CSS 版本
* 版本二:原生 SCSS 版本 [馨云](https://github.com/hsin-yunn/hex_school_node_final_scss)、[灰塵貓](https://github.com/qoo584769/node_final_design)
* 版本三:Bootstrap5+SCSS 版本 [wendy](https://github.com/Wendy03/metawall/tree/master/stylesheets)
* 版本四:TailwindCSS 版[承蔚](https://github.com/linche0859/Node.js-Final)、[士桓](https://github.com/huan5678/nodeJS-Final-Design-layout)、[Chao Next.js](https://github.com/oneraner/metawall)
### 週末任務二:mongoose todolist kata 壓在 30 min 內,前三名送書
1. 觀看「什麼是 mongoose?不是已經學 mongoDB shell ?」此章節影片,將 todolist kata 任務內容,再加上 Mongoose 連接 MongoDB 雲端資料庫,錄製壓在 30 min 內
2. 請錄製 YouTube 影片,錄製時間需在 4/8 22:00~4/10 23:59:59
3. 請做完後到大廳 tag 洧杰,提交
* GitHub Repo、裡頭需附上 連接 mongoDB Alsta 的 POSTMAN
* YouTube 連結
### Vic
Github : https://github.com/Hsuan777/todolist-mongoose-kata2
Youtube : https://www.youtube.com/watch?v=AnHn1o1mRAw
## Kimn
Github : https://github.com/kimnTai/todoList-kata
Youtube : https://youtu.be/9hbNmCNOtzc