整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ
(6)被迫吃芒果的前端工程師 - MongoDB CRUD 之 Update
前言
終於算是暫時脫離了 Read 章節,接下來就會進入 Update 章節,畢竟有新增資料就會有更新資料。
Update
在 MongoDB 有三種更新方式
db.collection.updateOnedb.collection.updateManydb.collection.replaceOne
基本上從名字就可以大致上知道運作模式,畢竟 Create 章節有出現類似的。
updateOne
updateOne 基本上可以帶入兩個參數,第一個是你要修改的物件屬性,舉例來講我要修改 name 叫做 Roy 的使用者
1 | |
接下來第二個參數也是一個物件屬性,只是傳入的是一個 $set,然後這個 $set 是一個物件,裡面會讓入你要改的屬性,例如我要將 Roy 年紀從 25 歲改成 30 歲
1 | |
最後記得在帶入一個參數,也就是 $currentDate: { lastModified: true }
1 | |

updateOne 中前兩個參數其實比較沒有什麼,主要是 $currentDate 比較讓人匪夷所思。
$currentDate 主要是加入一個修改時間,也就是 lastModified,因此你輸出時你才會看到 lastModified,但 $currentDate 其實是選填的。
updateMany
這時候我們來做一件事情,如果有兩個相同名字都叫做 Ray 的使用者,然後使用 updateOne 會怎麼樣。
你可以先試著輸入以下將 Mark 使用者更新一下
1 | |

接下來我們搜尋名稱叫做 Ray 的使用者,然後將年齡都改成 30
1 | |
雖然你輸入之後他會回傳你修改成功,但你會發現只會更新第一筆資料,也就是 MongoDB 第一個找到的使用者

如果想要批量更新的話,那就要使用另一個語法,也就是 updateMany
1 | |
這樣子才能夠達到批量更新的方式,因此我們可以知道 updateOne 會針對第一筆回傳的資料做更新,就不會再往下了,而 updateMany 會針對全部搜尋到的資料都更新一輪。
replaceOne
replaceOne 以我自己來講…其實很少使用,只是寫法不需要撰寫 $set,但基本上第一個參數也是尋找條件,第二個則是內容
1 | |
這邊要注意一件事情 replaceOne 語法是整個覆蓋的概念,因此上面語法中並沒有寫入 name 與 status 就會被覆蓋掉只寫入 age

因此使用 replaceOne 要多加注意。
如果要還原剛剛的程式碼,可以這樣寫
1 | |

整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ