3.10 Mongoose 基于Model的更新操作

文档更新可以使用以下几种方法

update()//往上改
updateMany() //改多个
updateOne() //改一个
findByIdAndUpdate() //通过i的查询 然后改
fingOneAndUpdate() //找到一个就改
find() + save()//栈 让然后改
findOne() + save()//找一个改

update()

第一个参数conditions为查询条件,第二个参数doc为需要修改的数据,第三个参数options为控制选项,第四个参数是回调函数

Model.update(conditions, doc, [options], [callback])

options有如下选项

   safe (boolean): 默认为true安全模式
  upsert (boolean): 默认为false如果不存在则创建新记录
  multi (boolean): 默认为false是否更新多个查询记录
  runValidators如果值为true执行Validation验证
  setDefaultsOnInsert如果upsert选项为true在新建时插入文档定义的默认值
  strict (boolean): 以strict模式进行更新
  overwrite (boolean): 默认为false禁用update-only模式允许覆盖记录

现在使用update()方法查询age大于20的数据,并将其年龄更改为40岁

如果要同时更新多个记录,需要设置options里的multi为true。下面将名字中有'a'字符的年龄设置为10岁

如果设置的查找条件,数据库里的数据并不满足,默认什么事都不发生

如果设置options里的upsert参数为true,若没有符合查询条件的文档,mongo将会综合第一第二个参数向集合插入一个新的文档

[注意]update()方法中的回调函数不能省略,否则数据不会被更新。如果回调函数里并没有什么有用的信息,则可以使用exec()简化代码

更新子文档的方法

updateMany()

updateMany()与update()方法唯一的区别就是默认更新多个文档,即使设置{multi:false}也无法只更新第一个文档

将数据库中名字中带有'huo'的数据,年龄变为50岁

find() + save()

如果需要更新的操作比较复杂,可以使用find()+save()方法来处理,比如找到年龄小于30岁的数据,名字后面添加'30'字符

updateOne()

updateOne()方法只能更新找到的第一条数据,即使设置{multi:true}也无法同时更新多个文档

将数据库中名字中带有'huo'的数据,年龄变为60岁

findOne() + save()

如果需要更新的操作比较复杂,可以使用findOne()+save()方法来处理,比如找到名字为'huochai'的数据,年龄加100岁

findOneAndUpdate()

fineOneAndUpdate()方法的第四个参数回调函数的形式如下function(err,doc){}

findByIdAndUpdate

fineByIdAndUpdate()方法的第四个参数回调函数的形式如下function(err,doc){}

Update的更新操作符

"$inc"增减修改器,只对数字有效

  • 找到age=22的文档,修改文档的age值自增1

'$set' 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型

  • 对5c4a819fb87ba4002a47bc4f 表进行软删除,找到特定_id数据,增加或者修改isDelete属性

"$unset"同上取反,删除一个键

  • 执行后age键不存在

'$push'给一个键push一个数组成员,键不存在会创建,对数组有效

  • 返回Article表中name为wxw的数据,增加一个array键,类型为数组,有一个成员 10

'$addToSet'向数组中添加一个元素,如果存在就不添加

  • 返回Article表中name为wxw的数据,array中有10所以不会添加

'$each'遍历数组和 $push 修改器配合可以插入多个值

  • 返回Article表中name为wxw的数据,执行后array : [10,1,2,3,4,5]

'$pop' 向数组中尾部删除一个元素

  • 返回Article表中name为wxw的数据,其中array : [10,1,2,3,4,5],执行后 array : [10,1,2,3,4]

  • tip:将1改成-1可以删除数组首部元素

'$pull' 向数组中删除指定元素

  • 返回Article表中name为wxw的数据,匹配到array中的10后将其删除

Last updated