点我返回主目录

参数

  • id <Object | Number | String> 要查询的 id
  • [update] <Object> 要更新的数据
  • [options] <Object> 选项同 Query.prototype.setOptions()
    • [options.returnDocument=’before’] <String> 有两个可选值:before 和 after。
      • before:默认值,在应用更新之前返回文档。也就是说,返回更新前的数据
      • after:在应用更新之后返回文档
    • [options.lean] <Object> 如果为真值,mongoose将以纯JavaScript对象而不是mongoose文档的形式返回文档。文档显示该字段的值类型为对象,但是它的默认值是 true,Query.lean()里显示类型为对象或布尔,但是没有参数为对象时的例子,先留着,以后再说
    • [options.session=null] <ClientSession> 与这次查询关联的会话
    • [options.strict] <Boolean | String> 覆盖 schema 的严格模式选项
    • [options.timestamps=null] <Boolean> 如果设置为 false 并且启用了架构级别的时间戳,跳过此更新的时间戳。请注意,这允许您覆盖时间戳。如果未设置架构级别的时间戳,则不执行任何操作
    • [options.overwrite=false] <Boolean> 如果设置为 true,Mongoose 将把 findByIdAndUpdate() 转换为 findByIdAndReplace()。这个选项已经废弃,仅提供向后兼容
    • [options.sort] <Object | String> 如果根据条件找到多个文档,则设置排序顺序已选择要更新的文档
    • [options.runValidators] <Boolean> 如果为 true,则在此命令上运行更新验证器。更新验证器根据模型的架构验证更新操作
    • [options.setDefaultsOnInsert=true] <Boolean> 如果该参数和 upsert 参数都是 true,如果创建了一个新文档,mongoose 将应用模型模式中指定的默认值
    • [options.rawResult] <Boolean> 如果为 true,返回 MongoDB 驱动程序的原始结果。没有处理过的结果
    • [options.upsert=false] <Boolean> 如果为 true 且没有查询到文档,将会插入一个新文档。upsert 插入新文档,setDefaultsOnInsert 指定使用默认值
    • [options.new=false] <Boolean> 如果为 true,返回修改后的文档,而不是原始文档。如果这个设置为 true,returnDocument 设置为 before,那会返回什么?
    • [options.select] <Object | String> 设置要返回的文档字段
    • [options.translateAliases=null] <Boolean> 如果设置为 true,则在 filter、projection、update 和 distinct 中转换任何架构定义的别名。如果在同一对象上同时定义别名和原始属性时存在任何冲突,则抛出错误

返回值

返回查到的那条数据,根据 options.returnDocument 的配置决定返回更新之前的还是更新之后的

例子

1
2
3
A.findByIdAndUpdate(id, update, options) // return Query
A.findByIdAndUpdate(id, update) // return Query
A.findByIdAndUpdate() // return Query

注意

不是所有的更新顶级键的原子操作都会被视为设置操作,比如:

1
2
3
Model.findByIdAndUpdate(id, { name: 'jason bourne' }, options)
// 以上操作改为
Model.findByIdAndUpdate(id, { $set: { name: 'jason bourne' }}, options)

这有助于防止意外的用 { name: ‘jason borune’ } 覆盖文档。想要阻止这种行为,查看 overwrite 选项

findOneAndX 和 findByIdAndX 方法支持有限验证。你可以通过设置 runValidators 启用

如果需要全量校验,请首先使用传统的方法检索文档

1
2
3
const doc = await Model.findById(id)
doc.name = 'jason bourne'
await doc.save()