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