# 模块二 基础巩固 MongoDB 更新和删除

## 2.5.4 MongoDB -- 更新和删除 <a href="#id-254mongodb-geng-xin-he-shan-chu" id="id-254mongodb-geng-xin-he-shan-chu"></a>

* 整体更新
* 更新字段
* 字段操作
* 数组操作
* 删除

<https://docs.mongodb.com/manual/reference/operator/update/>

* updateOne
* updateMany
* replaceOne

### 整体更新 <a href="#zheng-ti-geng-xin" id="zheng-ti-geng-xin"></a>

```
db.questions.replaceOne({},{})
```

### 更新字段 <a href="#geng-xin-zi-duan" id="geng-xin-zi-duan"></a>

```
db.author.updateOne({"name":"mingson"},
    {
        $set: {"age": 20},
        $inc: {"view", -2}
    }
)
```

### 字段操作 <a href="#zi-duan-cao-zuo" id="zi-duan-cao-zuo"></a>

| Name         | Description       |
| ------------ | ----------------- |
| $currentDate | 设置为当前时间           |
| $inc         | 原子级增减操作           |
| $min         | 当传入的值比数据库中的值小时才更新 |
| $max         | 当传入的值比数据库中的值大时才更新 |
| $mul         | 原子级相乘             |
| $rename      | 重命名字段             |
| $set         | 设置字段值             |
| $setOnInsert | 仅当                |
| $unset       | 移除字段              |

```
db.questions.updateOne({"tags": {$in: ["c#"]}},
    {
        $inc: {"view": NumberInt(-2)},
        $set: {"title": "第一个问题updated"}
    }
)
```

### 数组操作 <a href="#shu-zu-cao-zuo" id="shu-zu-cao-zuo"></a>

| Name           | Description             |
| -------------- | ----------------------- |
| $              | 更新数组的第一个元素              |
| $\[]           | 更新数组的所有元素               |
| array.\[index] | 更新指定下标元素                |
| $addToSet      | 添加元素到数组（当元素不存在于原来的数组当中） |
| $pop           | 移除第一个或者最后一个元素           |
| $pull          | 移除符合条件的数组元素             |
| $pullAll       | 移除指定元素                  |
| $push          | 添加到最后                   |
| $each          | 添加多个元素                  |
| $position      | 指定插入的位置                 |
| $slice         | 对数据切割                   |
| $sort          | 对数组排序                   |
| $\[]           | 更新指定条件的元素               |

```
// 把第一个包含 test2 的数组的元素改为 test3，即把数组元素里面第一个 test2 改为 test3，而不是数组的第一个元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$set: {"tags.$": "test3"}})

// 更新所有元素，所有 test2 更新为 test3
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$set: {"tags.$[]": "test3"}})

// 更新指定下标元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$set: {"tags.2": "c#"}})

// 添加元素到数组（当元素不存在于原来的数组当中）
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$addToSet: {"tags": "c#"}})

// 移除第一个
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$pop: {"tags": -1}})

// 移除最后一个元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$pop: {"tags": 1}})

// 移除符合条件的数组元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$pull: {"tags": {$in: ["c#"]}}})

// 移除指定元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$pullAll: {"tags": ["test3", "asp.net core"]})

// 添加到最后
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$push: {"tags": "test3"})

// 添加多个元素
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$each: {"tags": ["c#", "test3"]})

// 指定插入的位置
db.questions.updateOne({"tags": {$in: ["test2"]}}, {$push: {"tags": {$each: ["c#", "test3"], $position: 0}})

// 对数据切割，对数组排序
db.students.update(
   { _id: 5 },
   {
     $push: {
       quizzes: {
          $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
          $sort: { score: -1 },
          $slice: 3
       }
     }
   }
)

// 更新指定条件的元素，把 answers 中 content 为 回答一 的设置为 回答
db.questions.updateOne({"tags": {$in: ["test2"]}}, {set: {"answers.$[elem].content": "回答", {"arrayFilters": [{"elem.content": "回答一"}]}}})
```

### 删除 <a href="#shan-chu" id="shan-chu"></a>

<https://docs.mongodb.com/manual/tutorial/remove-documents/>

```
db.inventory.deleteOne( { status: "D" } )

db.inventory.deleteMany({ status : "A" })
```
