---
tags: Node.js 直播班 - 2022 春季班
---
# 🏅 Day 8
## Schema 補充
### Schema Options
建立 Schema 時,Mongoose 也有提供一些可調整的設定
```
new mongoose.Schema({..}, options);
```
在 `Schema()` 中第一個參數放 Schema,第二個參數可以調整設定
可以參考[文件說明](https://mongoosejs.com/docs/guide.html#options)查看可調整的 options
#### versionKey
新增 document 時,預設都會在 document 中加上 `__v: 0`,若不需要加上此設定的話,可以設定 `versionKey: false` 將 versionKey 移除
```javascript
new mongoose.Schema({..}, { versionKey: false });
```
#### collection
Mongoose 預設會將 model 連接的 collection 的名稱轉為全小寫,並以複數呈現,例如
```javascript
const User = mongoose.model('User', userSchema);
```
`'User'` 會被視為 **users**,若是需要不同的 collection 名稱,可以透過 `{ collection: '...' })` 更改
```javascript
new mongoose.Schema({..}, { collection: 'data' });
```
上方設定會將 collection 名稱改為 `data`,若是 `mongoose.model('Test', Schema);` 設定不同的 collection 名稱,仍然會以 `{ collection: 'data' }` 為主
#### timestamps
可以透過 `{ timestamps: true }` 為每筆新增的 document 加上 `createdAt` 和 `updatedAt` 欄位
也可以透過 `{ timestamps: { createdAt: 'created_at' }, { updatedAt: 'updated_at' } }` 自定義 `createdAt` 和 `updatedAt` 欄位
因設定 timestamps 預設會同時加入 `createdAt` 和 `updatedAt`,若只想加入其中一個欄位,則可以將欄位加在 Schema 中
```javascript
new mongoose.Schema({
...
createdAt: {
type: Date,
default: Date.now
}
});
```
若不希望在前端顯示資料建立時間也可以加入 `select: false` 設定
```javascript
new mongoose.Schema({
...
createdAt: {
type: Date,
default: Date.now,
select: false
}
});
```
### 參考資源
[Mongoose v6.2.10: Schemas](https://mongoosejs.com/docs/guide.html#options)
[Mongoose v6.2.10: SchemaTypes](https://mongoosejs.com/docs/schematypes.html)
[移除欄位 __v 方法](https://courses.hexschool.com/courses/1670869/lectures/39252177) 到 [另一種新增方法 create()](https://courses.hexschool.com/courses/1670869/lectures/39252180)(章節影片)
### 題目(將答案寫在 HackMD 並提交至回報區)
延續 Day6 的每日任務,調整手搖飲的 Schema
- 加入 createdAt 欄位,並設定為隱藏欄位(不會顯示於前端)
- 隱藏 versionKey 欄位
## :herb: <font color="#E58638">
提交範例
```javascript
const drinkSchema = new mongoose.Schema({
/* 填入 Schema 內容 */
product: {String,required: [true, '產品名稱未填寫']},
price:{Number,required: [true, '價錢未填寫']},
ice: {String,default: '正常冰'},
sugar :{String,default: '全糖'},
toppings :[{body: String}],
createdAt :{type: Date,
default: Date.now ,
select: false}},
/* 填入 options 內容 */
{versionKey: false}});
```
回報流程
---
請同學依照下圖教學觀看解答、回報答案:

回報格式:請在「回報區」貼上連結回報答案 (為了統計人數,請同學依序加上「報數」)
<!-- 解答
```javascript
const drinkSchema = new mongoose.Schema({
product: {
type: String,
required: [true, '產品名稱未填寫']
},
price: {
type: Number,
required: [true, '價錢未填寫']
},
ice: {
type: String,
default: "正常冰"
},
sugar: {
type: String,
default: "全糖"
},
toppings: [{type: String}],
/* 加入 createdAt */
createdAt: {
type: Date,
default: Date.now,
select: false
}
},{
versionKey: false
});
```
-->