--- tags: Node.js 直播班 - 2024 入門班 --- # 第一週主線任務 ### 前置作業 1. 請建立一個 database,並建立一個 `posts` collection 2. 將此 [JSON 資料](https://drive.google.com/file/d/1VCuWX2M6K-Du8pWlrcGImO_ux4Zwsa6v/view?usp=sharing),透過 Compass 倒入到 `posts` collection ``` 貼文集合欄位介紹 - name:貼文姓名 - imageUrl:貼文圖片 - content:貼文內容 - likes:按讚數 - comment:留言數 - createdAt:發文時間 - type:貼文種類[fan(粉絲)、group(社團)] - tags:貼文標籤 ``` ## 題庫 ### 課程範圍 1. 搜尋 name 欄位為 "Ray Xu" 的 document 列表 ``` =JavaScript db.post.find({name: 'Ray Xu'}) ``` ![image](https://hackmd.io/_uploads/Hy_je_Cl0.png) 2. 新增一筆 document,請全部欄位皆填寫 ``` =JavaScript db.posts.insertOne( { name: 'yanennn', imageUrl: 'http://dummyimage.com/214x100.png/cc0000/ffffff', content: '測試文章', likes: 100, comment: 0, tags: '[搞笑, 心情]', type: 'group', createdAt: "2024-04-18 21:50:44 UTC" } ) ``` ![image](https://hackmd.io/_uploads/B1B0G_0gA.png) 3. 新增多筆 document,請全部欄位皆填寫 ``` =JavaScript db.posts.insertMany([ { name: 'yanennn2', imageUrl: 'http://dummyimage.com/214x100.png/cc0000/ffffff', content: '測試文章222', likes: 10, comment: 20, tags: '[搞笑, 心情]', type: 'group', createdAt: "2024-04-18 21:50:44 UTC" }, { name: 'yanennn2', imageUrl: 'http://dummyimage.com/214x100.png/cc0000/ffffff', content: '測試文章222', likes: 300, comment: 0, tags: '[搞笑, 心情]', type: 'group', createdAt: "2024-04-18 21:50:44 UTC" }, { name: 'yanennn2', imageUrl: 'http://dummyimage.com/214x100.png/cc0000/ffffff', content: '測試文章222', likes: 420, comment: 110, tags: '[搞笑]', type: 'group', createdAt: "2024-04-18 21:50:44 UTC" } ]) ``` ![image](https://hackmd.io/_uploads/S1hS4_RgR.png) 4. 修改一筆 document,filter 條件請用 `_id` 指定其中一筆資料,`content` 欄位調整為`測試資料` ```=JavaScript db.posts.updateOne( { "_id":ObjectId("6620ee2160d7acb30a92fb80") }, { $set:{ content:"測試資料" } } ) ``` ![image](https://hackmd.io/_uploads/rJQHr_RlR.png) 5. 修改多筆 name 欄位為 "Ray Xu" 的 document 列表,content 欄位都調整為哈哈你看看你 ```=JavaScript db.posts.updateMany( { "name":"Ray Xu" }, { $set:{ content:"哈哈你看看你" } } ) ``` ![image](https://hackmd.io/_uploads/S1TTEt0lR.png) 6. 刪除一筆 document,filter 條件請用 _id 任意指定其中一筆資料 ```=JavaScript db.posts.deleteOne( { "_id":ObjectId("6620ee2160d7acb30a92fba1") } ) ``` ![image](https://hackmd.io/_uploads/HJycSYRxA.png) 7. 刪除多筆 document,filter 條件請用 type 為 group 的值,刪除所有社團貼文 ```=JavaScript db.posts.deleteMany( { "type":"group" } ) ``` 8. 刪除多筆 document,filter 條件為以下條件 a. name:"Ray Xu" b. likes: 500(含) 個讚以下 ```=JavaScript db.posts.deleteMany( { "name":"Ray Xu", "likes": {$lte: 500} } ) ``` ![image](https://hackmd.io/_uploads/rkfkr5Re0.png) 9. 查詢全部 posts 的 document 列表 ```=JavaScript db.posts.find() ``` ![image](https://hackmd.io/_uploads/HkpeL9AgC.png) 10. 關鍵字搜尋 name 裡面含有 o 的 document 列表 ```=JavaScript db.posts.find({name: /o/}) ``` ![image](https://hackmd.io/_uploads/BJ2kUcCgA.png) 11. 查詢 name 欄位為 "Ray Xu" ,filter 篩選出介於 500~1000(含) 個讚(大於等於 500、小於等於 1000) ```=JavaScript db.posts.find( { "name":"Ray Xu", "likes": {$lte: 1000, $gte: 500} } ) ``` ![image](https://hackmd.io/_uploads/SkJtLcRxA.png) 12. 查詢 `comment ` 有超過 500(含)以上的 document 列表 ```=JavaScript db.posts.find( { "comments": {$gte: 500}, } ) ``` ![image](https://hackmd.io/_uploads/S10VwcAxC.png) 13. 查詢 `tag` 欄位,有 `謎因` **或(or)** `幹話` 的 docuemnt 列表 ```=JavaScript db.posts.find( { "tags": {$in: [ "謎因", "幹話" ]} } ) ``` ![image](https://hackmd.io/_uploads/Hkhrd50lC.png) 14. 查詢 `tag` 欄位,有 `幹話` 的 docuemnt 列表,需隱藏 `_id` 欄位 ```=JavaScript db.posts.find( { "tags": {$in: ["幹話" ]} }, { "_id": 0 } ) ``` ![image](https://hackmd.io/_uploads/S1hbq50gA.png) 15. 請嘗試用 Mongo Shell 指令刪除全部 Documents ```=JavaScript db.posts.deleteMany({}) ``` ### 自主研究題 1. posts 所有 document 數量為?(回傳數字) ``` =JavaScript db.posts.find().count() ``` ![image](https://hackmd.io/_uploads/Hyz9ocRg0.png) 2. 請查詢 `name` 為 `Ray Xu` 的 document 列表,排序為由新到舊 ```=JavaScript db.posts.find({"name": "Ray Xu"}).sort({"createdAt": -1}) ``` ![image](https://hackmd.io/_uploads/rJd1a5CxA.png) 3. 請查詢 `name` 為 `Ray Xu` 的 document 列表,顯示前 30 筆資料 ```javascript db.posts.find({"name": "Ray Xu"}).limit(30) ``` ![image](https://hackmd.io/_uploads/HJ5cpqCgA.png) 4. 請查詢 `name` 為 `Ray Xu` ,顯示100(含) 個讚以上的前 30 筆 document 列表,時間排序由新到舊 ```javascript db.posts.find({"name": "Ray Xu", "likes": {$gte: 100}}).limit(30).sort({"createdAt": -1}) ``` ![image](https://hackmd.io/_uploads/HkIDRc0eR.png) 5. 請查詢 `comment` 超過 `100` 的 document 列表,跳過前 30 筆資料,再顯示 30 筆資料 ```javascript db.posts.find({"comments": {$gt: 100}}).skip(30).limit(30) ``` ![image](https://hackmd.io/_uploads/BJku_oCgR.png) 6. 尋找超夯熱門貼文,請查詢 `likes` **且(and)** `comments` 都超過 `1,500(含)` 的 document 列表 ```javascript db.posts.find({ $and: [ {"comments": {$gte: 1500}}, {"likes": {$gte: 1500}}, ] }) ``` ![image](https://hackmd.io/_uploads/ryv7ZiCg0.png) 7. 尋找普通熱門貼文,請查詢 `likes` **或(or)** `comments` 超過 `1,000(含)` 的 document 列表 ```javascript db.posts.find({ $or: [ {"comments": {$gte: 1000}}, {"likes": {$gte: 1000}}, ] }) ``` 8. 查詢 `image` 欄位為 `null` 的 document 列表 ```javascript db.posts.find({ "image": null }) ``` ![image](https://hackmd.io/_uploads/B1XaWoAxA.png) 9. 隨意找一筆 document 資料,將 `tag` 欄位裡的陣列,新增一個新 tag 為 `遊記` ```javascript db.posts.updateOne( {"_id":ObjectId("66211aff60d7acb30a930741")}, {$addToSet:{"tags":"遊記"}} ) ``` > $addToSet :為群組裡唯一的值建立一個數組,去除重複的值。 > $push : 傳回組內所有值的數組,不去除重複的值 > ![image](https://hackmd.io/_uploads/BybYIoAgA.png) 10. 將所有 `tag` 陣列裡的 `感情` 都移除 ```javascript db.posts.updateMany( {}, {$pull:{"tags":"感情"}} ) ``` > $pull 從陣列中刪除一個元素。 > $unset 刪除整個陣列(或任何其他欄位) ![image](https://hackmd.io/_uploads/rJ6RwjRlR.png)