Model.findOneAndUpdate(filter, update[, options][, callback])
html
filter
爲 {}
,更新第一條數據{operator: { field: value, ... }, ... }
mongodb
update
操做符update
操做符,統一被視爲 $set
操做(mongoose 特有)字段相關操做符segmentfault
符號 | 描述 |
---|---|
$set | 設置字段值 |
$currentDate | 設置字段值爲當前時間,能夠是 Date 或時間戳格式。 |
$min | 只有當指定值小於當前字段值時更新 |
$max | 只有當指定值大於當前字段值時更新 |
$inc | 將字段值增長 + 指定數量,指定數量能夠是負數,表明減小。 |
$mul | 將字段值乘以 x 指定數量 |
$setOnInsert | 搭配 upsert: true 選項一塊兒使用。找到匹配文檔,做用相似 $set ;沒找到,就添加一條新數據 |
$unset | 刪除指定字段,數組中的值刪後改成 null 。 |
若是字段不存在,這些操做符都會添加字段,而且字段值設置爲指定值,$mul
設置爲與指定值同類型的 0
。api
數組字段相關操做符數組
符號 | 描述 |
---|---|
$ | 充當佔位符,用來表示匹配查詢條件的數組字段中的第一個元素 {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
lean
:true
返回普通的 js 對象,而不是 Mongoose Documents
。new
:布爾值,true
返回更新後的數據,false
(默認)返回更新前的數據。fields/select
:指定返回的字段。sort
:若是查詢條件找到多個文檔,則設置排序順序以選擇要更新哪一個文檔。maxTimeMS
:爲查詢設置時間限制。upsert
:布爾值,若是對象不存在,則建立它。默認值爲 false
。omitUndefined
:布爾值,若是爲 true
,則在更新以前刪除值爲 undefined
的屬性。runValidators
:若是爲 true
,則在此命令上運行更新驗證器。更新驗證器根據 schema
驗證更新數據。rawResult
:若是爲 true
,則返回來自 MongoDB 的原生結果。null
{}
形式)options
的 {new:true}
,更新成功返回更新後的該條數據( {}
形式)filter
爲空,則更新第一條數據Model.findByIdAndUpdate(id, update[, options][, callback])
htm
Model.findByIdAndUpdate(id, update)
至關於 Model.findOneAndUpdate({ _id: id }, update)
。對象
{}
對象形式。id
爲 undefined
或 null
,result
返回 null
。result
返回 null
。Model.update(filter, update[, options][, callback])
multi
:默認 false
,只更新第一條數據;爲 true
時,符合查詢條件的多條文檔都會更新。overwrite
:默認爲 false
,即 update
參數若是沒有操做符或操做符不是 update
操做符,將會默認添加 $set
;若是爲 true
,則不添加 $set
,視爲覆蓋原有文檔。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
的數據和以前沒有變化,則 nModified
爲 0
。Model.updateMany(filter, update[, options][, callback])
更新符合查詢條件的全部文檔,至關於 Model.update(filter, update, { multi: true }[, callback])
Model.updateOne(filter, update[, options][, callback])
與 update()
相同,只是它不支持 multi
和 overwrite
選項參數,update
參數必須使用 update
操做符。
只更新第一條符合條件的文檔的屬性,若是要覆蓋文檔的所有內容,請使用 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 }
Model.findOneAndReplace(filter, replace[, options][, callback])
替換文檔,不能夠包含 _id
字段,不可使用任何 update
操做符。
new
lean
omitUndefined
sort
maxTimeMS
select / projection
rawResult
null
{}
形式)options
的 {new:true}
,替換成功返回替換後的該條數據( {}
形式)filter
爲空,則替換第一條數據這種方法更新文檔比較自由,可自行進行字段驗證。
Model.findById(id, function (err, doc) { if (err) return 'err'+err; doc.name = 'dora.wang'; doc.save(callback); });