mongoose 系列之二 update 更新

findOneAndUpdate()

Model.findOneAndUpdate(filter, update[, options][, callback])html

參數一:filter

參數二:update

{operator: { field: value, ... }, ... }mongodb

  • 必須使用 update 操做符
  • 若是沒有操做符或操做符不是 update 操做符,統一被視爲 $set 操做(mongoose 特有)

update 操做符

字段相關操做符segmentfault

符號 描述
$set 設置字段值
$currentDate 設置字段值爲當前時間,能夠是 Date 或時間戳格式。
$min 只有當指定值小於當前字段值時更新
$max 只有當指定值大於當前字段值時更新
$inc 將字段值增長 + 指定數量,指定數量能夠是負數,表明減小。
$mul 將字段值乘以 x 指定數量
$setOnInsert 搭配 upsert: true 選項一塊兒使用。找到匹配文檔,做用相似 $set;沒找到,就添加一條新數據
$unset 刪除指定字段,數組中的值刪後改成 null

若是字段不存在,這些操做符都會添加字段,而且字段值設置爲指定值,$mul 設置爲與指定值同類型的 0api

數組字段相關操做符數組

符號 描述
$ 充當佔位符,用來表示匹配查詢條件的數組字段中的第一個元素 {operator:{ "arrayField.$" : value }}
$[ ] 充當佔位符,用來表示匹配查詢條件的數組字段中的全部元素 {operator:{ "arrayField.$[]" : value }}
$[identifier] 充當佔位符,表示與查詢條件匹配的文檔的 arrayFilters 條件匹配的全部元素。
$addToSet 向數組字段中添加以前不存在的元素 { $addToSet: {arrayField: value, ... }}value 是數組時可與 $each 組合使用。
$push 向數組字段的末尾添加元素 { $push: { arrayField: value, ... } }value 是數組時可與 $each 等修飾符組合使用。
$pop 移除數組字段中的第一個或最後一個元素 { $pop: {arrayField: -1(first) / 1(last), ... } }
$pull 移除數組字段中與查詢條件匹配的全部元素 { $pull: {arrayField: value / condition, ... } }
$pullAll 從數組中刪除全部匹配的值 { $pullAll: { arrayField: [value1, value2 ... ], ... } }

修飾符mongoose

{ $push: { arrayField: { modifier: value, ... }, ... } }ide

符號 描述
$each 修飾 $push$addToSet 操做符,以便爲數組字段添加多個元素。
$position 修飾 $push 操做符以指定要添加的元素在數組中的位置。
$slice 修飾 $push 操做符以限制更新後的數組的大小。
$sort 修飾 $push 操做符來從新排序數組字段中的元素。

修飾符執行的順序(與定義的順序無關):code

  • 在指定的位置添加元素以更新數組字段
  • 按照指定的規則排序
  • 限制數組大小
  • 存儲數組

參數三:options

  • leantrue 返回普通的 js 對象,而不是 Mongoose Documents
  • new:布爾值,true 返回更新後的數據,false (默認)返回更新前的數據。
  • fields/select:指定返回的字段。
  • sort:若是查詢條件找到多個文檔,則設置排序順序以選擇要更新哪一個文檔。
  • maxTimeMS:爲查詢設置時間限制。
  • upsert:布爾值,若是對象不存在,則建立它。默認值爲 false
  • omitUndefined:布爾值,若是爲 true,則在更新以前刪除值爲 undefined 的屬性。
  • runValidators:若是爲 true,則在此命令上運行更新驗證器。更新驗證器根據 schema 驗證更新數據。
  • rawResult:若是爲 true,則返回來自 MongoDB 的原生結果。

參數四:callback

  • 沒找到數據返回 null
  • 更新成功返回更新前的該條數據( {} 形式)
  • options{new:true},更新成功返回更新後的該條數據( {} 形式)
  • 沒有查詢條件,即 filter 爲空,則更新第一條數據

findByIdAndUpdate()

Model.findByIdAndUpdate(id, update[, options][, callback])htm

id

Model.findByIdAndUpdate(id, update) 至關於 Model.findOneAndUpdate({ _id: id }, update)對象

result 查詢結果

  • 返回數據的格式是 {} 對象形式。
  • idundefinednullresult 返回 null
  • 沒符合查詢條件的數據,result 返回 null

update()

Model.update(filter, update[, options][, callback])

options

  • multi:默認 false,只更新第一條數據;爲 true 時,符合查詢條件的多條文檔都會更新。
  • overwrite:默認爲 false,即 update 參數若是沒有操做符或操做符不是 update 操做符,將會默認添加 $set;若是爲 true,則不添加 $set,視爲覆蓋原有文檔。

callback

callback(err, rawResponse)

  • err:錯誤信息
  • rawResponse:Mongo 返回的原生的 response
let result = await Model.update({name: 'dora'}, {$set: {age: 18}})
// { n: 1, nModified: 1, ok: 1 }
  • n更新的文檔數量。
  • nModified:更新的文檔數量,若是 update 的數據和以前沒有變化,則 nModified0

updateMany()

Model.updateMany(filter, update[, options][, callback])

更新符合查詢條件的全部文檔,至關於 Model.update(filter, update, { multi: true }[, callback])

updateOne()

Model.updateOne(filter, update[, options][, callback])

update() 相同,只是它不支持 multioverwrite 選項參數,update 參數必須使用 update 操做符。

只更新第一條符合條件的文檔的屬性,若是要覆蓋文檔的所有內容,請使用 replaceOne()

replaceOne()

Model.replaceOne(filter, replace[, options][, callback])

配置與 update() 相同,只是會用 replace 參數中的數據覆蓋符合條件的第一條文檔,而不是更新屬性,不支持任何 update 操做符。

let result = await Model.replaceOne({name: 'dora'}, {name:'dora.wang', age: 18})
// { n: 1, nModified: 1, ok: 1 }

findOneAndReplace()

Model.findOneAndReplace(filter, replace[, options][, callback])

replace

替換文檔,不能夠包含 _id 字段,不可使用任何 update 操做符。

options

  • new
  • lean
  • omitUndefined
  • sort
  • maxTimeMS
  • select / projection
  • rawResult

callback

  • 沒找到數據返回 null
  • 替換成功返回替換前的該條數據( {} 形式)
  • options{new:true},替換成功返回替換後的該條數據( {} 形式)
  • 沒有查詢條件,即 filter 爲空,則替換第一條數據

使用 save() 更新文檔

這種方法更新文檔比較自由,可自行進行字段驗證。

Model.findById(id, function (err, doc) {
  if (err) return 'err'+err;
  doc.name = 'dora.wang';
  doc.save(callback);
});
相關文章
相關標籤/搜索