---
tags: Node.js 直播班 - 2023 春季班
---
# 🏅 Day 7 - Model、Mongoose 新增/查詢
### Model
延續前一天的每日任務,接下來會建立 Model,以連接資料庫中的 Collection 及 Schema,並使用建立好的 Model 新增、查詢 document
須先在專案中引入 Mongoose 套件、連線本地端資料庫,並建立 Schema(可參考 Day6 每日任務)
建立 Model 寫法如下
```javascript=
const roomSchema = new mongoose.Schema({
name: String,
price: {
type: Number,
required: [true, '價格必填']
},
rating: Number
});
// 建立 Model
const Room = mongoose.model('Room', roomSchema);
```
`mongoose.model()` 第一個參數為 Collection 的名稱,第二個參數帶入 Schema
其中需注意第一個參數 Collection 的名稱,Mongoose 會自動視為小寫開頭及改為複數(結尾加 s)
因此 `Room` Model 實際上是連接至名稱為 `rooms` 的 Collection
接著可以使用 Model 新增 document
### Mongoose 新增
新增寫法如下
```javascript=
const Room = mongoose.model('Room', roomSchema);
const testRoom = new Room({
name: '總統套房單人房',
price: 2000,
rating: 4.5
});
testRoom.save()
.then(() => {console.log('新增資料成功')})
.catch((error) => {console.log(error)})
```
建立 Model 後,若要使用 Model 新增資料,需先使用 `new` 建立 Room 的實體(instance),一個 Model 的 instance 就是 document
產生一個 document 後就可以使用 `save()` 將其儲存到 rooms Collection 中
新增 document 也可以使用另一種方式`create()`
```javascript=
Room.create({
name: '總統套房單人房',
price: 2000,
rating: 4.5
})
```
執行後可以連線至 MongoDB Compass 本地端資料庫 `'mongodb://localhost:27017/test'`(test 可更換為自己建立的資料庫名稱)查看,若新增成功可以看到 rooms collection 中會有剛剛新增的資料
```
_id: ObjectId('...')
name: '總統套房單人房'
price: 2000
rating: 4.5
__v: 0
```
### Mongoose 查詢
Model instance 可以使用 `.find()` 查詢 documents
```javascript
// 查詢所有 documents
Room.find({});
// 帶入篩選條件
Room.find({ name: '總統套房單人房' })
```
### 參考資源
- [Mongoose v6.2.10: Models](https://mongoosejs.com/docs/models.html)
- [Mongoose v6.2.10: Model](https://mongoosejs.com/docs/api/model.html)
- 課程影音「Mongoose 新增 Model 流程」
## 題目(將答案寫在 HackMD 並提交至回報區)
延續前一天每日任務練習的手搖飲 Schema,建立名稱為 Drink 的 Model,並嘗試新增一筆 document
新增 document 內容如下
```
product: '鮮奶茶',
price: 55,
sugar: '微糖'
```
提交範例
```javascript=
const ___ = mongoose.model('___', schema 名稱);
const ___ = new ___({
/* 新增 document 內容 */
});
___.save()
.then(() => {console.log('新增資料成功')})
.catch((error) => {console.log(error)})
// 或另一種方式
___.create({
/* 新增 document 內容 */
})
```
## 回報流程
將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)

<!-- 解答:
const Drink = mongoose.model('Drink', drinkSchema);
const newDrink = new Drink({
product: '鮮奶茶',
price: 55,
sugar: '微糖'
});
newDrink.save()
.then(() => {console.log('新增資料成功')})
.catch((error) => {console.log(error)})
// 或
Drink.create({
product: '鮮奶茶',
price: 55,
sugar: '微糖'
})
-->
回報區
---
| 報數 | 組別/Discord 名字 | Codepen/其他回饋 |
|:----:|:-------------------:|:---------------------------------------------------------------------------------------------------------------------------------:|
| 1 | 北 10 組 / Benson | [Github Benson - Day 7](https://github.com/ioveasdkre/HexschoolOperation/tree/main/NodejsEnterpriseClass/day40-tasks/day7/app.ts) |
| 2 | 北 1 組 / PittWu | [Blog Post - Day 7](https://pitt-wu-blog.vercel.app/docs/day7-model-mongoose-add) |
| 3 | 北 8 組 / Zhao Chen | [GitHub - Day 7](https://github.com/zhao1995chen/NodejsEnterpriseClass/blob/master/daily-task/day7/server.ts) |
| 4 | 北 1 組 / MayYi | [HackMD - Day 7](https://hackmd.io/bWsKK2jIT-WURE0cIuokoA) |
| 5 | 南 2 組 / fengyao | [GitHub - Day 7](https://github.com/fengyao33/sixfeet/blob/main/pratice7-Model.ts) |
| 6 | 中 3 組 / Wendy | [Notion - Day 7](https://jewel-cellar-80e.notion.site/Day-7-Model-Mongoose-f4da05d4a47242dfb9886f7a7a0cce41) |
| 7 | 中 4 組 / jimkk159 | [HackMD - Day 7](https://hackmd.io/xqhbXtRtSzCYZ06cqgNvqw)|
| 8 | 北 5 組 / 圈圈 | [Codepen - Day 7](https://codepen.io/wjejfczn-the-bold/pen/YzOdrMe?editors=0010)|
| 9 | 北 12 組 / Sam Lin | [GitHub - Day 7](https://github.com/samlin1122/hex-school/blob/main/daily-challenges/day7.js)
| 10 | 北 8 組 / Ryder | [GitHub - Day 7](https://github.com/rider159159/Node_class_Daily/blob/main/Day07/app.ts)
| 11 | 北 13 組 / Louisa | [GitHub - Day 7](https://github.com/louisa0416/NodejsEnterpriseClass/tree/master/daily-task/day07) |
| 12 | 北 13 組 / sasha | [Codepen - Day 7](https://codepen.io/sasay/pen/KKxjYgE)|
|13|北5組 / albee| [GitHub- Day 7](https://github.com/albee-chang/hexschool-node-dailytask/blob/main/day7/sever.js)|
|14| 南 1 組 / hiYifang | [HackMD - Day 7](https://hackmd.io/@gPeowpvtQX2Om6AmD-s3xw/HyTyStcV5)|
|15| 北 16 組 / 啊培培 | [GitHub- Day 7](https://github.com/LABIBI-LG/Courses/blob/main/hexschool/nodeJS/Live_Course/Daily_Tasks/day7/main.js)|