---
# System prepended metadata

title: Node.js MongoDB 資料庫管理-第一週主線任務
tags: [Node]

---

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


