(14)被迫吃芒果的前端工程師 - Mongoose 之 Update

前言

前面認識了查詢語法,那麼接下來就要認識更新的語法,在 Mongoose 中更新的語法是與 MongoDB 稍微有一點不同的,但本質上並不會太難,所以就來認識一下吧。

Update

在 Mongoose 中一樣是支援 updateOneupdateManyreplaceOne 語法的,但是在這邊並不是使用 $set 語法,而是直接寫要更新成怎樣

1
2
3
4
5
6
7
8
9
10
User.updateOne(
{
nickname: 'RayXu'
},
{
nickname: 'Ray'
}
).then((data) => {
console.log('data', data);
})

更新成功後也一樣會回傳給你一些資訊

updateOne

如果你想確定自己是否修改成功的話,那麼也可以自己試試看前面章節所學的 find 語法。

另一個 updateManyreplaceOne 就不示範了,畢竟概念相同只是變成了不用寫 $set 而已。

難道 Mongoose 就只有這樣嗎?其實 Mongoose 還有提供其他更新語法

  • findByIdAndUpdate
  • findOneAndUpdate

光看上方語法就可以很直覺知道分別是搜尋 ID 並更新以及搜尋並更新,那寫法有差嗎?讓我們先來看一下 findOneAndUpdate

1
2
3
4
5
6
7
8
User.findOneAndUpdate(
{
nickname: 'Ray'
},
{
nickname: 'RayXu'
}
)

你會發現好像跟使用 update 沒有什麼差異,但其實真正差異在於 findOneAndUpdatefindByIdAndUpdate 可以設置第三個參數,以下截至官方文件

  • new: bool - true to return the modified document rather than the original. defaults to false
  • upsert: bool - creates the object if it doesn’t exist. defaults to false.
  • overwrite: bool - if true, replace the entire document.
  • fields: {Object|String} - Field selection. Equivalent to .select(fields).findOneAndUpdate()
  • maxTimeMS: puts a time limit on the query - requires mongodb >= 2.6.0
  • sort: if multiple docs are found by the conditions, sets the sort order to choose which doc to update
  • runValidators: if true, runs update validators on this command. Update validators validate the update operation against the model’s schema.
  • setDefaultsOnInsert: true by default. If setDefaultsOnInsert and upsert are true, mongoose will apply the defaults specified in the model’s schema if a new document is created.
  • rawResult: if true, returns the raw result from the MongoDB driver
  • strict: overwrites the schema’s strict mode option for this update

但通常來講我們並不會使用全部的參數,而只會使用特定參數,例如 new 參數就非常好用,因為預設修改成功後 Mongoose 只會回傳修改的資訊,而不會回傳修改成功的資料,如果期望結果是修改成功後會回傳修改成功的資料的話,那麼就將 new 改為 true 即可。

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

findOneAndUpdate

那麼 updatefindOneAndUpdate 哪一個比較好呢?我個人是比較喜歡 findOneAndUpdate 畢竟可以設置修改回傳後的資料以及從語法閱讀上就可以知道先做了查詢後再更新,因此我個人比較喜歡 findOneAndUpdate