--- tags: Node.js 直播班 - 2022 春季班 --- # 🏅 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 流程](https://courses.hexschool.com/courses/1670869/lectures/39252173)(章節影片) ### 題目(將答案寫在 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 內容 */ }) ``` 回報流程 --- 請同學依照下圖教學觀看解答、回報答案: ![](https://i.imgur.com/QtL8zEW.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: '微糖' }) --> 回報區 --- | 報數 | 組別 / 名字 | codepen / hackMD / 其他回饋 | | ---- | -------------------- | -------------------------------------------------------------------- | | 1 | 第 6 組 / Wendy | [Codepen](https://codepen.io/wendy03/pen/vYpvGLL) | | 2 | 第 2 組 / Jin | [Codepen](https://codepen.io/Jin-L/pen/QWazNGQ) | | 3 | 第 2 組 / Vic | [hackMD](https://hackmd.io/4cTXuxk7QPy31sZsNh9wkg) | | 4 | 第 4 組 / 苡安 | [hackMD](https://hackmd.io/@L7K9-66lSeagS28AP0_GjQ/BkP2gNK45) | | 5 | 第 3 組 / HedgehogKU | [HackMD](https://hackmd.io/9mS_SKbCS_6KVo8eMnLoSg) | | 6 | 第 5 組 / HazelWu | [HackMD@Hazel](https://hackmd.io/@hazelwu/nodejs-daily) | | 7 | 第 8 組 / Hank | [HackMD](https://hackmd.io/@TFOivyvXT-qpG6SieUTfgw/rJAQ5HqNq) | | 8 | 第 2 組 / Genos | [HackMD](https://hackmd.io/5A8AcAMeSSOA96WvjFH48g?view) | | 9 | 第 3 組 / Larry | [HackMD](https://hackmd.io/fZ_E6reESxSi8tnk48K3rg) | | 10 | 第 4 組 / sihle | [HackMD](https://hackmd.io/@bugbug777/Sy65ZL5N9) | | 11 | 第 3 組 / Hobby | [HackMD](https://hackmd.io/@hobbyling/HkdehNqN9) | | 12 | 第 14 組|East | [HackMD](https://hackmd.io/883aaVfgRdeGdeH4CiAzGg) | | 13 | 第 7 組|程翔 | [Codepen](https://codepen.io/xxxiang/pen/JjMwKoR?editors=1010) | | 14 | kk | [Codepen](https://codepen.io/potatokaka/pen/QWazEQe?editors=0010) | | 15 | 第13組 / KFC | [Codepen](https://codepen.io/kuan-fu-chen/pen/XWVojZE?editors=1010) | | 16 | 第 9 組 / 黃士桓 | [HackMD](https://hackmd.io/X405nyqIQ6-Gf70hgBY6sA) | | 17 | Naiky | [HackMD @Naiky](https://hackmd.io/@UWBC7rrORiKaLSBg226mZg/Hyrcbv54q) | | 18 | 第 3 組 / hiYifang | [HackMD](https://hackmd.io/@gPeowpvtQX2Om6AmD-s3xw/HyTyStcV5) | | 19 | 第 3 組 / Justin | [HackMD](https://codepen.io/justin3737/pen/eYybBPa?editors=0010) | | 20 | 第 16 組 / 皓皓 | [HackMD](https://hackmd.io/@cutecat8110/BkkziWrV9) | | 21 | 第 6 組 / Ruta | [HackMD](https://codepen.io/rue503/pen/XWVogwM) | | 22 | 第 4 組 / 小宥 | [HackMD](https://hackmd.io/c2vro8XURjuWcwvN2NwKcQ) | | 23 | 第 2 組 / Rikkubook | [Codepen](https://codepen.io/rikkubook/pen/RwxEjKx) | | 24 | 第 2 組 / wendy.li | [HackMD](https://hackmd.io/Gs6DVBSuRTSP_sqthnPmJQ) | | 25 | 第 9 組 / konstante | [HackMD](https://hackmd.io/kRr4u5FpQkmATS0ftRT-Cg?view) | | 26 | 第 11 組 / mandy | [HackMD](https://codepen.io/manyu1225/pen/podrwMj?editors=1010) | |27|第14組/Uniza|[Codepen](https://codepen.io/unizalin/pen/popqprR)| |28|第 1 組 / Claire|[HackMD](https://hackmd.io/rfBEVzHVQjivIhI_V3RcIA)| |29| 第 9 組 / Reynold | [Codepen](https://hackmd.io/@dL7AuQEMQ6KpCSRHaYElOA/Hk45_-s4c) |30| 第 11 組 / Han Lai | [Codepen](https://codepen.io/x94han/pen/XWVoZGv) |31|第 6 組 / 馨云|[HackMD](https://hackmd.io/@ceLocii_Tk-5B0mgomZ5Xw/HJgdkGs45)| |32|第 1 組 / Ed Huang|[HackMD](https://hackmd.io/@fcxE16V_Rnia2jW-B_yH2g/S1usa-iN9)| | 33 | 第 3 組 / Adam Hsu |[HackMD](https://hackmd.io/@S9gD__kVTSiQUupQNn_4FQ/Hko1K5oNc) | | 34 | 第 5 組 / Nap |[HackMD](https://hackmd.io/@8x8YzkXNSzafUSO3LZTmUw/SyTNvhj49) | | 35 | 第 8 組 / JackLee |[Codepen](https://codepen.io/yxzzktmb/pen/popqEKr) | |36 | 第 12 組 / Jimmy|[HackMD](https://hackmd.io/49CMS-CTS_i-A7CY5Or6rA)| |37 | 第 2 組 / peter|[HackMD](https://hackmd.io/@peterchen1024/By9mBCjE5)| |38 | 第 8 組 / Jordan Tseng|[HackMD](https://codepen.io/jordan-ttc-design/pen/XWVovJM?editors=0011)| |39 | 第 2 組 / Joe chang|[HackMD](https://hackmd.io/uaRTw9c0TgOrADyXMmGL0Q?view#418---model%E3%80%81Mongoose-%E6%96%B0%E5%A2%9E--%E6%9F%A5%E8%A9%A2)| | 40 | 第 15 組 / Tofu | [Codepen](https://codepen.io/Tofutseng/pen/KKZJdNE) | 41 | 第 1 組 / Jerry Huang | [HackMD](https://hackmd.io/LDwqGCQIR3qRu8ZLhVJ6pA?both) | 42 | 第 8 組 / Albert | [HackMD](https://hackmd.io/@Albertnotes/Bk9Y_la49) | 43 | 第 3 組 / 小葉 | [HackMD](https://hackmd.io/@FyKv37KcRSWqAO_e336w8g/HyMqxMaEq) | 44 | 第 1 組 / snow | [HackMD](https://hackmd.io/@snowsuika/BJ7_e60Vq) | 45 | 第 15 組 / CHIU | [Codepen](https://codepen.io/awdx8326/pen/jOYJPQY) | 46 | 第 15 組 /yolala | [HackMD](https://hackmd.io/cgr-DYEvRH2t_BsbKZfJnA?both) | 47 | nick6303 | [HackMD](https://hackmd.io/RGPpIFVLR6iRLNx_6ctQSw) | 48 | 第 7 組 / jason06286 | [HackMD](https://hackmd.io/MCSzHztbQT2KmZbF9Wmv2Q) | 49 | 第 10 組 / 橘子 | [HackMD](https://hackmd.io/N_vf1XboSw60NHPr5EdDRQ?view) | 50 | 第 5 組 / AmberCYT | [HackMD](https://hackmd.io/@amber871023/HkzRYKzB5/%2FSUSiCKkDTD-fEtIEhy3N7A) | 51 | 第 1 組 / Phoebe | [HackMD](https://hackmd.io/@Phoebe26/HyZ3Eq7r9) | 52 | 第 10 組 / Otis | [Codepen](https://codepen.io/humming74/pen/mdpZXyx?editors=0010) | 53 | 第 15 組 / Castiel | [Codepen](https://codepen.io/everydaycodedog/pen/xxpvyyd) | 54 | 第 7 組 / TracyChien | [HackMD](https://hackmd.io/@TracyChien/SyRQ27FB5) | 55 | 第 1 組 / Emily Hsi | [Codepen](https://codepen.io/EmilyHsi/pen/KKQKYaW) | 56 | 第 10 組 / Butters | [HackMD](https://hackmd.io/LUfrCZKJSomftx2a-lY6dg?view) | 57 | 第 14 組 / 皮皮 | [HackMD](https://hackmd.io/1OpWpsyTTuGLRpdgeIA-IQ)