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);
});
相关文章
相关标签/搜索