findOneAndUpdate()Model.findOneAndUpdate(filter,update[,options][,callback])参数1:filter查询语句同find(),filter为{},更新第一个数据参数2:update{operator:{field:value,...},...}必须使用updateoperator。如果没有operator或者operator不是updateoperator,会被认为是一个$set操作(mongoose-specific)当前时间,可以是Date或timestamp格式。$min仅当指定值小于当前字段值时更新$max仅当指定值大于当前字段值时更新$inc增加字段值+指定金额,指定金额可以为负数,即意味着减少。$mul将字段值乘以x指定数量$setOnInsert与upsert:true选项一起使用。查找匹配的文档,功能类似于$set;如果没有找到,添加一条新数据$unset删除指定字段,数组中的值被删除并变为null。如果该字段不存在,这些运算符将添加该字段,并将字段值设置为指定值,并将$mul设置为与指定值相同类型的0。数组字段相关运算符符号说明$充当占位符,用于表示数组字段中第一个符合查询条件的元素{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移除数组字段中符合查询条件的元素Allelements{$pull:{arrayField:value/condition,...}}$pullAll从数组中移除所有匹配的值{$pullAll:{arrayField:[value1,value2...],...}}装饰表示法{$push:{arrayField:{modifier:value,...},...}}表示法$each修改$push和$addToSet运算符以将多个元素添加到数组字段。$position修改$push运算符以指定要添加的元素在数组中的位置。$slice修改$push运算符以限制更新数组的大小。$sort修改$push运算符以重新排序数组字段中的元素。修饰符的执行顺序(与定义顺序无关):在指定位置添加元素更新数组字段按指定规则排序限制数组大小存储数组参数三:optionslean:true返回普通的js对象而不是MongooseDocuments。new:布尔值,true返回更新后的数据,false(默认)返??回更新前的数据。fields/select:指定要返回的字段。sort:如果查询条件找到多个文档,则设置排序顺序来选择更新哪一个文档。maxTimeMS:设置查询的时间限制。upsert:Boolean,如果对象不存在,则创建。默认值为假。omitUndefined:布尔值,如果为真,则在更新前删除值为undefined的属性。runValidators:如果为真,则在此命令上运行更新验证器。更新验证器根据模式验证更新数据。rawResult:如果为真,则返回来自MongoDB的原始结果。参数4:回调没有找到数据,返回null。如果更新成功,则在options中返回更新前的数据({}形式){new:true}。如果更新成功,则不带查询条件返回更新后的数据({}形式)。即如果过滤器为空,则更新第一条数据。findByIdAndUpdate()Model.findByIdAndUpdate(id,update[,options][,callback])idModel.findByIdAndUpdate(id,update)等同于Model.findOneAndUpdate({_id:id},update)。result查询结果以{}对象的形式返回数据。id未定义或为null,结果返回null。如果没有满足查询条件的数据,result返回null。update()Model.update(filter,update[,options][,callback])optionsmulti:默认false,只更新第一条数据;为true时,将更新满足查询条件的多个文档。overwrite:默认为false,即如果update参数没有operator或者operator不是updateoperator,默认会加上$set;如果为true,则不添加$set,视为覆盖原文档。callbackcallback(err,rawResponse)err:错误信息rawResponse:Mongo返回的原生响应result=awaitModel.update({name:'dora'},{$set:{age:18}})//{n:1,nModified:1,ok:1}n:要更新的文档数。nModified:更新文档的个数,如果更新的数据与之前没有变化,则nModified为0。updateMany()Model.updateMany(filter,update[,options][,callback])更新所有满足查询条件的文档,等价于Model.update(filter,update,{multi:true}[,callback])updateOne()Model.updateOne(filter,update[,options][,callback])和update()一样,只是不支持multi和overwriteoption参数,update参数必须使用update操作符。仅更新符合条件的第一个文档的属性。如果要覆盖文档的全部内容,请使用replaceOne()。replaceOne()Model.replaceOne(filter,replace[,options][,callback])配置与update()相同,只是replace参数中的数据会覆盖第一个满足条件的文档,而不是更新属性,不支持任何更新运算符。letresult=awaitModel.replaceOne({name:'dora'},{name:'dora.wang',age:18})//{n:1,nModified:1,ok:1}findOneAndReplace()Model.findOneAndReplace(filter,replace[,options][,callback])替换替换文档,替换文档不能包含_id字段,也不能使用任何更新运算符。optionsnewleanomitUndefinedsortmaxTimeMSselect/projectionrawResultcallback没有找到数据,返回null如果替换成功,返回替换前的那条数据({}形式)。{new:true}ofoptions,如果替换成功,返回替换后的数据({}形式)无查询条件,即filter为空,则替换第一条数据。使用save()更新文档。这种方式更新文档比较自由,可以自己进行字段验证。Model.findById(id,function(err,doc){if(err)return'err'+err;doc.name='dora.wang';doc.save(callback);});
