(6)被迫吃芒果的前端工程師 - MongoDB CRUD 之 Update

前言

終於算是暫時脫離了 Read 章節,接下來就會進入 Update 章節,畢竟有新增資料就會有更新資料。

Update

在 MongoDB 有三種更新方式

  • db.collection.updateOne
  • db.collection.updateMany
  • db.collection.replaceOne

基本上從名字就可以大致上知道運作模式,畢竟 Create 章節有出現類似的。

updateOne

updateOne 基本上可以帶入兩個參數,第一個是你要修改的物件屬性,舉例來講我要修改 name 叫做 Roy 的使用者

1
2
3
db.usersupdateOne({
name: 'Roy'
})

接下來第二個參數也是一個物件屬性,只是傳入的是一個 $set,然後這個 $set 是一個物件,裡面會讓入你要改的屬性,例如我要將 Roy 年紀從 25 歲改成 30 歲

1
2
3
4
5
6
7
8
9
10
db.users.updateOne(
{
name: 'Roy'
},
{
$set: {
age: 30
}
}
)

最後記得在帶入一個參數,也就是 $currentDate: { lastModified: true }

1
2
3
4
5
6
7
8
9
10
11
12
13
db.users.updateOne(
{
name: 'Roy'
},
{
$set: {
age: 30
},
$currentDate: {
lastModified: true
}
},
)

updateOne

updateOne 中前兩個參數其實比較沒有什麼,主要是 $currentDate 比較讓人匪夷所思。

$currentDate 主要是加入一個修改時間,也就是 lastModified,因此你輸出時你才會看到 lastModified,但 $currentDate 其實是選填的。

updateMany

這時候我們來做一件事情,如果有兩個相同名字都叫做 Ray 的使用者,然後使用 updateOne 會怎麼樣。

你可以先試著輸入以下將 Mark 使用者更新一下

1
2
3
4
5
6
7
8
9
10
11
12
13
db.users.updateOne(
{
name: 'Mark'
},
{
$set: {
name: 'Ray'
},
$currentDate: {
lastModified: true
}
},
)

updateOne

接下來我們搜尋名稱叫做 Ray 的使用者,然後將年齡都改成 30

1
2
3
4
5
6
7
8
9
10
11
12
13
db.users.updateOne(
{
name: 'Ray'
},
{
$set: {
age: 30
},
$currentDate: {
lastModified: true
}
},
)

雖然你輸入之後他會回傳你修改成功,但你會發現只會更新第一筆資料,也就是 MongoDB 第一個找到的使用者

updateOne

如果想要批量更新的話,那就要使用另一個語法,也就是 updateMany

1
2
3
4
5
6
7
8
9
10
11
12
13
db.users.updateMany(
{
name: 'Ray'
},
{
$set: {
age: 28
},
$currentDate: {
lastModified: true
}
},
)

這樣子才能夠達到批量更新的方式,因此我們可以知道 updateOne 會針對第一筆回傳的資料做更新,就不會再往下了,而 updateMany 會針對全部搜尋到的資料都更新一輪。

replaceOne

replaceOne 以我自己來講…其實很少使用,只是寫法不需要撰寫 $set,但基本上第一個參數也是尋找條件,第二個則是內容

1
2
3
4
5
6
7
8
db.users.replaceOne(
{
name: 'Roy'
},
{
age: 26,
}
)

這邊要注意一件事情 replaceOne 語法是整個覆蓋的概念,因此上面語法中並沒有寫入 namestatus 就會被覆蓋掉只寫入 age

replaceOne

因此使用 replaceOne 要多加注意。

如果要還原剛剛的程式碼,可以這樣寫

1
2
3
4
5
6
7
8
9
10
11
12
db.users.replaceOne(
{
age: {
$eq: 26
}
},
{
name: 'Roy',
age: 26,
status: true
}
)

還原

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你也可以考慮請我喝一杯咖啡

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ