--- tags: Node.js 直播班 - 2023 春季班 --- # 第一週 mongoDB 資料庫教學 ## 開課提醒 1. 錄影 2. [每日任務挑戰列表](https://rpg.hexschool.com/training/34/show?embedhm=mp7_fvnlRFm-m14hEySetQ) 3. [Adobe XD 設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/grid) 4. 在 discord 分享一個開會議題 ## mongoDB 資源 1. [mongoDB 簡報](https://whimsical.com/mongodb-FCuHtC9DW1SHqRWBKsJKp1) 2. [Adobe XD 設計稿](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/) ## 前置環境安裝 * [mongo 安裝](https://www.mongodb.com/try/download/community) * [compass 安裝](https://www.mongodb.com/try/download/compass) ## 以旅館訂房網來說明([簡報](https://whimsical.com/mongoose-YKTKL5aF4pHQbkemgQTMZH)) * 透過 excel 與學員來講解 mongoDB * rooms、users ## 如何開啟一個 mongo 資料庫,預設開啟 :27017 port 1. 新增 data 與 log 資料夾 2. 指行指令:`mongod --dbpath "data 資料夾"` 3. 若要有 log: `mongod --dbpath "DB資料夾路徑" --logpath "LOG資料夾路徑/mongo.log"` ``` mongo 與 mongod 指令差異 1. mongod:server 端開啟伺服器應用 2. mongo: 客戶端,直連造訪您開啟的 server 應用 MAC 可開設活動監視器觀看 ``` ## 常見指令 ## 資料庫顯示 - 顯示資料庫:show dbs - 切換資料庫:use `資料庫名稱` - 觀看指令資料庫裡面的集合:show collections ### 新增一筆資料 insertOne ```jsx db.rooms.insertOne( {"name":"單人房","price":1000,"rating":4.5} ) ``` ### 新增多筆資料 insertMany ```jsx db.rooms.insertMany( [ { "rating": 4.3, "price": 1500, "name": "豪華單人房" }, { "rating": 4.8, "price": 2000, "name": "雙人房" } ] ) ``` ## 中場休息 > 洧杰 NOTE:刪除既有 compass 資料 ### 尋找集合裡面的資料 db.collections.find() ``` ## 一般搜尋 - db.集合名稱(collections name).find() - 尋找對應屬性:db.collections.find({屬性名稱:屬性值}) - 模糊搜尋:db.rooms.find({"name":/雙/}) - 數值區間:db.collections.find({屬性名稱:{$gt:400}}) - 複合條件:db.collections.find({屬性名稱:{$gt:400},rating:{$gte:4.4}}) ## 常用語法 - project 保護欄位:db.rooms.find({"name":/雙/},{"_id":0}) - 搜尋陣列裡面的值:db.rooms.find({"payment":{$in:["信用卡"]}}) ``` | $eq | 等於 | | --- | --- | | $ne | 不等於 | | $gt | 大於 | | $lt | 小於 | | $gte | 大於等於 | | $lte | 小於等於 | | $in | 存在某個值 | | $nin | 不存在某個值 | 邏輯運算子:or 或 and - `$or:find({$or:[{},{}]})` ```=javascript db.rooms.find( { $and: [ {price:{$lte:1500}}, {rating:{$gte:4.5}} ] } ) ``` ## 修改 updateOne `replaceOne()`,只能替換整個文件,`updateOne()`則允許更新欄位。 ```jsx db.rooms.updateOne( {"_id":ObjectId("621edf99a20aa7506a116f9a")} ,{$set:{name:"修改雙人房"}}) ``` ### 修改多個值 [updateMany](https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/)(filter 篩選 >$set 更換設定) ```jsx db.rooms.updateMany( {rating:{$gt:4.5}}, {$set:{price:300}} ) ``` ### 替換整個文檔:replaceOne、replaceMany **db.collection.replaceOne(filter, replacement, options)** ```jsx db.rooms.replaceOne( {"_id":ObjectId("621edf99a20aa7506a116f9a")}, {name:"yes~"}) ``` ### 刪除多個文件:deleteMany(filter) 刪除全部:`db.rooms.deleteMany()` ```jsx db.rooms.deleteMany( { rating:{$gte:4.3} }) ``` ## driver 介紹 1. [mongoDB 官方文件](https://www.mongodb.com/docs/drivers/) 2. [.NET Core](https://docs.microsoft.com/zh-tw/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-6.0&tabs=visual-studio) 3. [Node.js NPM Mongoose](https://mongoosejs.com/docs/api/model.html#model_Model.findOne) ## 資料集 ``` =JavaScript [ { "rating": 4.5, "price": 1000, "name": "標準單人房", "payment":["信用卡","ATM"] }, { "rating": 4.3, "price": 1500, "name": "豪華單人房", "payment":["信用卡","ATM"] }, { "rating": 4.8, "price": 2000, "name": "標準雙人房", "payment":["信用卡","ATM"] }, { "rating": 4.7, "price": 2500, "name": "豪華雙人房", "payment":["ATM"] }, { "rating": 4.0, "price": 3000, "name": "標準四人房", "payment":["現金"] }, { "rating": 3.5, "price": 10000, "name": "總統套房", "payment":["現金"] } ] ``` ## 本堂作業 * [chatGPT 解法](https://sharegpt.com/c/qhd97jP) #### 前置作業 1. 請建立一個 database,並建立一個 `posts` collection 2. 將此 [JSON 資料](https://drive.google.com/file/d/1VCuWX2M6K-Du8pWlrcGImO_ux4Zwsa6v/view?usp=sharing),透過 Compass 倒入到 `posts` collection 貼文集合欄位介紹 - name:貼文姓名 - image:貼文圖片 - content:貼文內容 - likes:按讚數 - comment:留言數 - createdAt:發文時間 - type:貼文種類\[fan(粉絲)、group(社團)\] - tags:貼文標籤 ### **主線任務** 1. 根據此 [HackMD](https://hackmd.io/@hexschool/HJOX15NZ9),依照題目敘述寫出相關操作指令 2. 將 todolist kata 再練三遍,總計六遍後,最後一次練習花多久時間? ### **作業分享** 1. 作業:請提供 **HackMD** 連結,並回報到此 [Discord](https://discord.com/channels/801807326054055996/1073411249926324234/1088021845825032214) 作業分享區 2. 分享最後 todolist 練習時間是多久,是否有練三遍?(選作)