---
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'})
```

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"
}
)
```

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"
}
])
```

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

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(含) 個讚(大於等於 500、小於等於 1000)
```=JavaScript
db.posts.find(
{
"name":"Ray Xu",
"likes": {$lte: 1000, $gte: 500}
}
)
```

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({})
```
### 自主研究題
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: [
{"comments": {$gte: 1500}},
{"likes": {$gte: 1500}},
]
})
```

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

9. 隨意找一筆 document 資料,將 `tag` 欄位裡的陣列,新增一個新 tag 為 `遊記`
```javascript
db.posts.updateOne(
{"_id":ObjectId("66211aff60d7acb30a930741")},
{$addToSet:{"tags":"遊記"}}
)
```
> $addToSet :為群組裡唯一的值建立一個數組,去除重複的值。
> $push : 傳回組內所有值的數組,不去除重複的值
>

10. 將所有 `tag` 陣列裡的 `感情` 都移除
```javascript
db.posts.updateMany(
{},
{$pull:{"tags":"感情"}}
)
```
> $pull 從陣列中刪除一個元素。
> $unset 刪除整個陣列(或任何其他欄位)
