--- tags: Node.js 直播班 - 2023 春季班 --- # 🏅 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 方法」到 「另一種新增方法 create()」 ### 題目(將答案寫在 HackMD 並提交至回報區) 延續 Day6 的每日任務,調整手搖飲的 Schema - 加入 createdAt 欄位,並設定為隱藏欄位(不會顯示於前端) - 隱藏 versionKey 欄位 提交範例 ```javascript= const drinkSchema = new mongoose.Schema({ /* 填入 Schema 內容 */ },{ /* 填入 options 內容 */ }); ``` ## 回報流程 將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: ```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 }); ``` --> 回報區 --- | 報數 | 組別/Discord 名字 | Codepen/HackMD/其他回饋 | |:----:|:-------------------:|:---------------------------------------------------------------------------------------------------------------------------------:| | 1 | 北 10 組 / Benson | [Github Benson - Day 8](https://github.com/ioveasdkre/HexschoolOperation/tree/main/NodejsEnterpriseClass/day40-tasks/day8/app.ts) | | 2 | 北 1 組 / PittWu | [Blog Post - Day 8](https://pitt-wu-blog.vercel.app/docs/day8-schema) | | 3 | 北 8 組 / Zhao Chen | [GitHub - Day 8](https://github.com/zhao1995chen/NodejsEnterpriseClass/blob/master/daily-task/day8/server.ts) | | 4 | 北 1 組 / MayY1 | [HackMD - Day 8](https://hackmd.io/E_IzGRCzQHeDK1xywqqSJA) | | 5 | 中 3 組 / Wendy | [Notion - Day 8](https://jewel-cellar-80e.notion.site/Day-8-Schema-45a9c41f215a4428ae3cd82214d60c72) | | 6 | 中 4 組 / jimkk159 | [codepen - Day 8](https://codepen.io/jimkk159/pen/BaOGWXx) | | 7 | 北 5 組 / 圈圈 | [codepen - Day 8](https://codepen.io/wjejfczn-the-bold/pen/abaPVdw?editors=0010) | | 8 | 北 12 組 / Sam Lin | [GitHub - Day 8](https://github.com/samlin1122/hex-school/blob/main/daily-challenges/day8.js) | 9 | 北 13 組 / Louisa | [GitHub - Day 8](https://github.com/louisa0416/NodejsEnterpriseClass/tree/master/daily-task/day08) | | 10 | 北 13 組 / sasha | [codepen - Day 8](https://codepen.io/sasay/pen/qBMzwmR) | |11|北5組/ albee|[GitHub- Day 8](https://github.com/albee-chang/hexschool-node-dailytask/blob/main/day8/app.js)| |12| 南 1 組 / hiYifang |[CodePen - Day 8](https://codepen.io/hiYifang/pen/qBpLqWG)| |13| 北 16 組 / 啊培培 |[GitHub - Day 8](https://github.com/LABIBI-LG/Courses/blob/main/hexschool/nodeJS/Live_Course/Daily_Tasks/day8/main.js)|