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); });