---
# System prepended metadata

title: 第一週主線任務
tags: [Node.js 直播班 - 2022 春季班]

---

---
tags: Node.js 直播班 - 2022 春季班
---
# 第一週主線任務

### 前置作業
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：按讚數
- comments：留言數
- createdAt：發文時間
- type：貼文種類[fan(粉絲)、group(社團)]
- tags：貼文標籤
```


## 題庫

### 課程範圍
1. 搜尋 name 欄位為 "Ray Xu" 的 document 列表
```javascript=
db.posts.find({"name":"Ray Xu"})
```


2. 新增一筆 document，請全部欄位皆填寫
```javascript=
db.posts.insertOne({
  "name": "qq",
  "tags": [
    "教育",
    "幹話",
    "感情"
  ],
  "type": "group",
  "image": "http://dummyimage.com/217x100.png/dddddd/000000",
  "createdAt": "2022-03-19 02:53:44 UTC",
  "content": "",
  "likes": 1277,
  "comments": 326
})
```
4. 新增多筆 document，請全部欄位皆填寫
```javascript=
db.posts.insertMany(
  [
    {
      "name": "Tony",
      "tags": [
        "教育",
        "幹話",
        "感情"
      ],
      "type": "group",
      "image": "http://dummyimage.com/217x100.png/dddddd/000000",
      "createdAt": "2022-03-19 02:53:44 UTC",
      "content": "",
      "likes": 1277,
      "comments": 326
    },
    {
      "name": "li",
      "tags": [
        "教育",
        "幹話",
        "感情"
      ],
      "type": "group",
      "image": "http://dummyimage.com/217x100.png/dddddd/000000",
      "createdAt": "2022-03-19 02:53:44 UTC",
      "content": "",
      "likes": 1277,
      "comments": 326
    },
  ]
  
)

```
4. 修改一筆 document，filter 條件請用 `_id` 指定其中一筆資料，`content` 欄位調整為`測試資料`
```javascript=
db.posts.updateOne(
    {"_id":ObjectId("6252e5274f045b42a5a136b9")},
    {$set:{"content":"測試資料"}}
)
```
5. 修改多筆 `name` 欄位為 `"Ray Xu"` 的 document 列表，`content` 欄位都調整為`哈哈你看看你`
```javascript=
db.posts.updateMany(
    {"name":"Ray Xu"},
    {$set:{"content":"哈哈你看看你"}}
)
```
6. 刪除一筆 document，filter 條件請用 `_id` 任意指定其中一筆資料
```javascript=
db.posts.deleteOne(
    {"_id":ObjectId("6252e5274f045b42a5a136b9")}
)
```
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}
    }
)
```
9. 查詢全部 `posts` 的 document 列表
```javascript=
db.posts.find()
```
10. 關鍵字搜尋 `name` 裡面含有 `o` 的 document 列表
```javascript=
//注意正則不要加引號
db.posts.find({"name":/o/})
```
11. 查詢`name` 欄位為 `"Ray Xu"` ，filter 篩選出介於 500~1000(含) 個讚
```javascript=
db.posts.find({
    $and:[
        {"name":"Ray Xu"},
        {"likes":{$gte:500}},
        {"likes":{$lte:1000}}
    ]  
})
//上面寫法為 500 以上 「且」 1000 以下 =10筆
//下面錯誤寫法為 500 以上 「和」 1000 以下 =會有20筆
db.posts.find({
        "name":"Ray Xu",
        "likes":{$gte:500},
        "likes":{$lte:1000} 
})
```
12. 查詢 `comments` 有超過 500(含)以上的 document 列表
```javascript=
db.posts.find({"comments":{$gte:500}})
```
13. 查詢 `tags`  欄位，有 `謎因` **或(or)** `幹話` 的 document 列表
```javascript=
db.posts.find(
    {
        $or:[
            {"tags":"迷因"},
            {"tags":"幹話"},
        ]
    }
)
// or
db.posts.find(
    {
        "tags":{
            $in:["迷因","幹話"]
        }
    }
)

```
14. 查詢 `tags`  欄位，有 `幹話` 的 document 列表，需隱藏 `_id` 欄位
```javascript=
db.posts.find(
    {"tags":"幹話"},
    {"_id":0}
)
//隱藏 = 0 只顯示 = 1
```
15. 請嘗試用 Mongo Shell 指令刪除全部 Documents
```javascript=
db.posts.deleteMany({})
```
### 自主研究題
1. posts 所有 document 數量為？(回傳數字)
```javascript=
db.posts.find().count()
```
2. 請查詢 `name` 為 `Ray Xu` 的 document 列表，排序為由新到舊

```javascript=
db.posts.find({"name":"Ray Xu"}).sort({"createdAt":-1})
```

3. 請查詢 `name` 為 `Ray Xu` 的 document 列表，顯示前 30 筆資料
```javascript=
db.posts.find({"name":"Ray Xu"}).limit(30)
```
4. 請查詢 `name` 為 `Ray Xu` ，顯示100(含) 個讚以上的前 30 筆 document 列表，時間排序由新到舊
```javascript=
db.posts.find({
    $and:[
        {"name":"Ray Xu"},
        {"likes":{
            $gte:100
        }}
    ]
}).limit(30).sort({"createdAt":-1})
```
5. 請查詢 `comments` 超過 `100` 的 document 列表，跳過前 30 筆資料，再顯示 30 筆資料 
```javascript=
db.posts.find(
    {
        "comments": {
            $gt: 100
        }
    }
).skip(30).limit(30)

```
6. 尋找超夯熱門貼文，請查詢 `likes` **且(and)** `comments` 都超過 `1,500(含)` 的 document 列表
```javascript=
db.posts.find({
    $and:[
        {"comments": {$gte:1500}},
        {"likes": {$gte:1500}}
    ]
})
```
7. 尋找普通熱門貼文，請查詢 `likes` **或(or)** `comments` 超過 `1,000(含)` 的 document 列表
```javascript=
b.posts.find({
    $or:[
        {"comments": {$gte:1500}},
        {"likes": {$gte:1500}}
    ]
})
```
8. 查詢 `image` 欄位為 `null` 的 document 列表
```javascript=
db.posts.find({
    "image":{
        $type: 10
    }
})
// or
db.posts.find({
    "image": null
})
```
[$type介紹](https://www.mongodb.com/docs/manual/reference/operator/aggregation/type/)

9. 隨意找一筆 document 資料，將 `tags` 欄位裡的陣列，新增一個新 tags 為 `遊記`
```javascript=

db.posts.updateMany(
    {"_id":ObjectId("6252e5274f045b42a5a136b9")},
    {
        $push:{
            "tags":"遊記"
        }
    }
)

```

[$addToSet 介紹](https://www.mongodb.com/docs/manual/reference/operator/update/addToSet/)

10. 將所有 `tags` 陣列裡的 `感情` 都移除

```javascript=
db.posts.updateMany({"tags":'感情'},{
    $pull:{
        "tags":"感情"
    }
})

```

