---
# System prepended metadata

title: Nodejs 直播班 - 第一週主線任務

---

# Nodejs 直播班 - 第一週主線任務

### 前置作業
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. 搜尋 name 欄位為 "Ray Xu" 的 document 列表
```javascript
db.posts.find({"name":"Ray Xu"})
```

2. 新增一筆 document，請全部欄位皆填寫
```javascript
db.posts.insertOne(
  {
    name: "Tim",
    tags: ['謎因', '電影'],
    type: "friend",
    image: "http://dummyimage.com/197x100.png/dddddd/000000",
    createdAt: new Date().toISOString(),
    content: "test content",
    likes: 9,
    comments: 19
  }
)
```

3. 新增多筆 document，請全部欄位皆填寫
```javascript
db.posts.insertMany(
  [
    {
      name: "Tim",
      tags: ['謎因', '電影'],
      type: "friend",
      image: "http://dummyimage.com/197x100.png/dddddd/000000",
      createdAt: new Date().toISOString(),
      content: "hahahahaha",
      likes: 9,
      comments: 19
    },
    {
      name: "Tim",
      tags: ['謎因'],
      type: "friend",
      image: "http://dummyimage.com/197x100.png/dddddd/000000",
      createdAt: new Date().toISOString(),
      content: "haha uccu",
      likes: 8,
      comments: 18
    },
  ]
)
```

4. 修改一筆 document，filter 條件請用 `_id` 指定其中一筆資料，`content` 欄位調整為`測試資料`
```javascript
db.posts.updateOne(
  {
    _id: ObjectId('625e18548608f014d88855bb')
  },
  {
    $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('625e18548608f014d88855bb')
  }
)
```

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. 查詢全部 `post` 的 document 列表
```javascript
db.posts.find()
```

10. 關鍵字搜尋 `name` 裡面含有 `o` 的 docuemnt 列表
```javascript
db.posts.find(
  {
    name: /o/
  }
)
```

11. 查詢`name` 欄位為 `"Ray Xu"` ，filter 篩選出介於 500~1000(含) 個讚（大於等於 500、小於等於 1000）
```javascript
db.posts.find(
  {
    name: "Ray Xu",
    likes: {
      $gte: 500,
      $lte: 1000
    }
  }
)
```

12. 查詢 `comment ` 有超過 500(含)以上的 document 列表
```javascript
db.posts.find(
  {
    comments: {
      $gte: 500,
    }
  }
)
```

13. 查詢 `tag`  欄位，有 `謎因` **或(or)** `幹話` 的 docuemnt 列表
```javascript
db.posts.find(
  {
    tags: {
      $in: ['謎因', '幹話']
    }
  }
)
```

14. 查詢 `tag`  欄位，有 `幹話` 的 docuemnt 列表，需隱藏 `_id` 欄位
```javascript
db.posts.find(
  {
    tags: {
      $in: ['幹話']
    }
  },
  {
    _id: 0
  }
)
```

15. 請嘗試用 Mongo Shell 指令刪除全部 Documents
```javascript
db.posts.deleteMany({})
```
<br>

### 自主研究題

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(
  {
    name: "Ray Xu",
    likes: {
      $gte: 100
    }
  }
).limit(30).sort({ createdAt: -1 })
```

5. 請查詢 `comment` 超過 `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: [
      {
        likes: { $gte: 1500 }
      },
      {
        comments: { $gte: 1500 }
      }
    ]
  }
)
```

7. 尋找普通熱門貼文，請查詢 `likes` **或(or)** `comments` 超過 `1,000(含)` 的 document 列表
```javascript
db.posts.find(
  {
    $or: [
      {
        likes: { $gte: 1000 }
      },
      {
        comments: { $gte: 1000 }
      }
    ]
  }
)
```

8. 查詢 `image` 欄位為 `null` 的 document 列表
```javascript
db.posts.find(
  {
    image: { $type: 10 }
  }
)
```

9. 隨意找一筆 document 資料，將 `tags` 欄位裡的陣列，新增一個新 tags 為 `遊記`
```javascript
// 1
db.posts.updateOne(
  {
    _id: ObjectId('625e24ff8608f014d888617b')
  },
  {
    $push: {
      tags: '遊記'
    }
  }
)

// 2
db.posts.updateOne(
    {
        _id: ObjectId('6266cae84262eb412fc4e98d')
    },
    {
        $push: {
            tags: {
                $each: ['遊記', '測試']
            }
        }
    }
)

// 3
db.posts.updateOne(
  {
    _id: db.posts.aggregate(
      [
        {
          $sample: { size: 1 }
        }
      ]
    ).next()._id
  },
  {
    $push: { tags: '遊記' }
  }
)

// 4
db.posts.aggregate(
  [{ $sample: { size: 1 } }]
).forEach(function (doc) {
  db.posts.updateOne(
    { _id: doc._id },
    { $addToSet: { tags: '遊記' } }
  )
})
```

10. 將所有 `tags` 陣列裡的 `感情` 都移除
```javascript
db.posts.updateMany(
  {},
  {
    $pull: {
      tags: '感情'
    }
  }
)
```
