---
# System prepended metadata

title: "\U0001F3C5 Day 7 - Model、Mongoose 新增／查詢"
tags: [Node.js 直播班 - 2023 春季班]

---

---
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 連結貼至底下回報就算完成了喔! 
解答位置請參考下圖（需打開程式碼的部分觀看）

![](https://i.imgur.com/vftL5i0.png)

<!-- 解答：  

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)|

