---
# System prepended metadata

title: "\U0001F3C5 Day 7 - Model、Schema Options"
tags: [Node.js 直播班 - 2024 春季班]

---

# 🏅 Day 7 - Model、Schema Options

### Model
建立 Model 連接資料庫中的 Collection 及 Schema，
就可以使用 Model 對 Collection 做資料相關處理（CRUD）

語法範例：
```javascript
// Model 名稱會使用大寫開頭
const CollectionModel = mongoose.model('Collection', collectionSchema);
```
> `mongoose.model()` 第一個參數為 Collection 的名稱，第二個參數帶入 Schema
> 其中需注意第一個參數 Collection 的名稱（`'Collection'`），Mongoose 會自動視為小寫開頭及改為複數（結尾加 s）
因此 `CollectionModel` 實際上是連接至名稱為 `collections` 的 Collection



### Schema Options

建立 Schema 時，Mongoose 也有提供一些可調整的設定
```javascript
const collectionSchema = new mongoose.Schema({..}, options);
```
在 `mongoose.Schema()` 中第一個參數放 Schema，第二個參數可以調整設定
以下介紹幾個設定，詳細可參考[文件說明](https://mongoosejs.com/docs/guide.html#options)查看所有可調整的 options

#### collection
Mongoose 預設會將 model 連接的 collection 的名稱轉為全小寫，並以複數呈現。以上方建立 Model 的範例語法為例：`'Collection'` 會被視為 `collections`。
若是需要固定的 collection 名稱，可以在 Schema 設定 `{ collection: '...' })`

範例：
```javascript
const collectionSchema = new mongoose.Schema(
  {..}, 
  { collection: 'testCollection' }
);
```
上方設定會將 collection 固定為 `testCollection`。
此時若是新增 Model 時設定不同的 collection 名稱連結該 Schema： 
`const testModel = mongoose.model('Test', collectionSchema);` 
仍然會以 `{ collection: 'testCollection' }` 的設定為主，連接至 `testCollection` Collection


#### versionKey
新增 document 時，預設都會在 document 中加上 `__v: 0`，若不需要加上此設定的話，可以設定 `versionKey: false` 將 versionKey 移除
```javascript
const collectionSchema = new mongoose.Schema(
  {..}, 
  { versionKey: false }
);
```
#### timestamps
在 Schema 設定 timestamps，在新增資料時會自動加上 `createdAt` 和 `updatedAt` 欄位
```javascript
const collectionSchema = new mongoose.Schema(
  {..}, 
  { timestamps: true }
);
```

### 參考資源
- [Mongoose: Schemas](https://mongoosejs.com/docs/guide.html#options)
- [Mongoose: SchemaTypes](https://mongoosejs.com/docs/schematypes.html)
- 課程章節「Mongoose NPM 教學」

題目
---
1. 延續前一天的 Schema 範例（訂房資訊 `orderSchema`），並根據以下需求調整與：
- 移除 createdAt 改為使用 timestamps，讓資料新增時自動帶入 `createdAt` 和 `updatedAt` 欄位
- 設定 collection 為 `orderCollection` 
```javascript
const orderSchema = new mongoose.Schema({
  /* 填入 Schema */
}, {
  /* 填入 options */
});
```
2. 建立 Model 連接 `orderCollection` 與 `orderSchema`


## 回報流程

將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 
解答位置請參考下圖（需打開程式碼的部分觀看）

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

<!-- 解答：  
const orderSchema = new mongoose.Schema({
  user: {
    type: String,
    required: [true, 'user is required.'],
    select: false
  },
  userTel: {
    type: String,
    required: [true, 'userTel is required.'],
    select: false
  },
  room: {
    type: String,
    required: [true, 'room is required.'],
    enum: ['單人房','雙人房','四人房']
  },
  isPaid: {
    type: Boolean,
    default: false
  }
}, {
  collection: 'orderCollection',
  timestamps: true,
});

const Order = mongoose.model('orderCollection', orderSchema);
// Model 名稱可以自行取名，但是需使用大寫開頭
-->




回報區
---
<!-- 
將答案貼至下方表格內，格式：
| Discord 暱稱 | [CodePen](連結) |
-->

| Discord | CodePen ／ 答案 |
|:-------:|:---------------:|
|   xxx   |   [CodePen]()   |
| 圈圈 | [CodePen](https://codepen.io/wjejfczn-the-bold/pen/yLrEvLv?editors=0010) |
| 羽 | [CodePen](https://codepen.io/lingling-Syu/pen/dyLKJBB?editors=0010) |
| 苡安 | [hackmd](https://hackmd.io/@L7K9-66lSeagS28AP0_GjQ/S1GA3GIgA) |
| Lobinda | [CodePen](https://codepen.io/Lobinda/pen/LYvrQWP) |
| YC | [CodePen](https://codepen.io/YCLu/pen/XWQEzKp) |
| 群嘉 | [CodePen](https://codepen.io/efzdamnp-the-lessful/pen/LYvrQJp?editors=0010)|
|   Jean   |   [CodePen](https://codepen.io/jeanchiang1221/pen/gOyKvEG)   |
| shuantt | [CodePen](https://codepen.io/th-tseng/pen/MWRXVYd)
| Otis | [CodePen](https://codepen.io/humming74/pen/oNOydWP)
| Chia Pin | [CodePen](https://codepen.io/joker-cat/pen/KKYeeeB)
| wei | [CodePen](https://codepen.io/Wei-the-sasster/pen/YzMvvOG?editors=0010)
| Tiya | [CodePen](https://codepen.io/Tiya_blank/pen/JjVZaWv)
| 阿旭 | [CodePen](https://codepen.io/koei-lu/pen/rNbKZdY)
|cho|[CodePen](https://codepen.io/cho195/pen/GRLGYJo)|
|kelvinnn|[CodePen](https://codepen.io/is-lin/pen/XWQYxLv)|
|ej_chuang|[CodePen](https://codepen.io/EJChuang/pen/dyLKwye)|
|william_hsu|[CodePen](https://codepen.io/william8815/pen/oNOyQVp)|
|tung030374 |[CodePen](https://codepen.io/tung__u/pen/mdgKaab)|
| Theodore | [CodePen](https://codepen.io/GustavoFringgg/pen/vYMrbjK?editors=0010) |
| Thomas | [CodePen](https://codepen.io/ThomasYeh/pen/abxjbMJ) |
| william威良 | [CodePen](https://codepen.io/snowman12320/pen/GRLBJpp?editors=1010) |
| runweiting | [CodePen](https://codepen.io/weiting14/pen/wvZxGye) |
| Hank | [CodePen](https://codepen.io/tw1720/pen/RwOJMKx) |
| Aida | [CodePen](https://codepen.io/ada23410/pen/gOyjmNb?editors=0010) |
| mei | [CodePen](https://codepen.io/l_umei/pen/rNbrmgb) |
| Fabio20 | [CodePen]([連結](https://codepen.io/fabio7621/pen/VwNBBRr?editors=0010)) |
| jenny7532| [CodePen](https://codepen.io/wei-chen-wu/pen/OJGwaOv) |
| 2魚 | [CodePen](https://codepen.io/ijrekmsn-the-sans/pen/wvZxNzW) |
| Henry | [Codepen](https://codepen.io/hekman1122/pen/eYojqgd?editors=0010) |
| Benson | [Codepen](https://codepen.io/nosneb83/pen/vYMzgWx) |
| zaoannihao | [CodePen](https://codepen.io/ckhwdvrx-the-solid/pen/poBOwBm) |
| blp100x | [CodePen](https://codepen.io/blp100/pen/jORvooa) |
| ellallu0903 | [CodePen](https://codepen.io/ellallu0903/pen/RwOqbmb) |
| yoshidc | [CodePen](https://codepen.io/yoshiyyc/pen/jORQQxY) |
| Cile    | [CodePen](https://codepen.io/nycteachen/pen/GRLweXq) |
| 瑀君 | [CodePen](https://codepen.io/yennnnn/pen/ZEZVpNE)|
| albertyang3576 | [CodePen](https://codepen.io/albertyang3576/pen/NWmmRKx?editors=0010)|
| puffy_chen | [CodePen](https://codepen.io/TernMayDay/pen/VwOvRzB?editors=1010)
