(20)被迫吃芒果的前端工程師 - MongoDB - Update Operators

前言

寫了很多 Mongoose 之後我才想到我似乎少寫了 MongoDB 中的 Update Operators 的部分,而 Update Operators 這一部分其實也很重要,所以就來補一篇 Update Operators 的 MongoDB 章節。

Update Operators

Update Operators 是 MongoDB 所提供的一些方法,方便你做一些計算或重新命名等,但是在開始之前我想特別說明一件事情,前面章節中的練習我們可以發現 Mongoose 中也可以撰寫一些在 MongoDB 章節的語法,因此有些 MongoDB 語法我們也會直接在 Mongoose 使用。

那麼回歸到 Update Operators 的部分,假設我們今天使用者每一次執行某個功能時,它的年齡會被增加 1 歲你可以是想你會怎麼寫 Mongoose 這一段,或許你會這樣撰寫

1
2
3
4
5
6
7
8
9
10
11
12
13
User.findOneAndUpdate(
{
nickname: 'mike'
},
{
age: 1
},
{
new: true,
}
).then((data) => {
console.log('data', data)
})

提醒一下,我們這邊 mike 儲存時的資料是以下

1
2
3
4
5
6
7
8
9
var mike = new User({
account: 'mike',
password: 'test1234',
nickname: 'mike',
age: 20,
job: '科技類',
})

mike.save();

那麼如果你是 age: 1 的話,其實會直接被更新成 1 歲

age

因此如果要達到年齡增加一歲也就是 20 歲變成 21 歲,那就要使用 MongoDB 中的 Update Operators,以官方文件來講加法就是 $inc,而使用方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User.findOneAndUpdate(
{
nickname: 'mike'
},
{
$inc: {
age: 1
}
},
{
new: true,
}
).then((data) => {
console.log('data', data)
})

$inc 的意思就是針對特定字段,也就是 age 增加多少,例如我寫 1 就代表著 +1

age

而這個技巧非常適合用於部落格文章的閱讀數量計算,例如當使用者取得某一篇文章時,就增加 postCount 一次這樣。

但這邊如果你有翻 Update Operators 文件的話,你會發現沒有減少的語法,因此如果你是要每次執行就減少 1 歲的話,則直接使用 - 就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
User.findOneAndUpdate(
{
nickname: 'mike'
},
{
$inc: {
age: -1
}
},
{
new: true,
}
).then((data) => {
console.log('data', data)
})

因此 $inc 會隨著你傳入的值是正數還是負數來決定是否減少與增加。

最後你會發現 Mongoose 中好像很長會混搭著 MongoDB 的語法,所以你可以把 Mongoose 理解成擴充版本的 MongoDB,Mongoose 針對 MongoDB 一些缺少的地方在做一些擴充強化,因此 MongoDB 語法會放在前面就是這樣子,因為非常重要。

參考文獻