MongoDB collection.findOneAndUpdate() 方法

Mongodb 是一个非关系型数据库,支持多种查询和修改操作。其中, findOneAndUpdate() 方法可以根据查询条件找到一个文档并对其进行修改或更新。

语法

findOneAndUpdate() 方法的基本语法如下:

db.collection.findOneAndUpdate(
   <filter>,
   <update>,
   {
     projection: <document>,
     sort: <document>,
     maxTimeMS: <number>,
     upsert: <boolean>,
     returnDocument: <enum>,
     arrayFilters: [ <filterdocument1>, ... ],
     collation: <document>,
     hint:  <document|string>
   }
)

参数说明:

  • filter:查询条件,与 find() 方法中的查询条件相同。
  • update:更新操作,与 update() 和 updateMany() 方法中的更新操作相同。
  • projection:可选参数,指定返回的字段。
  • sort:可选参数,指定排序方式。
  • maxTimeMS:可选参数,指定最大执行时间。
  • upsert:可选参数,如果为 true,则在找不到对应文档时创建一个新文档。
  • returnDocument:可选参数,指定返回的文档是更新前的还是更新后的文档。
  • arrayFilters:可选参数,用于更新数组类型字段。
  • collation:可选参数,指定排序规则。
  • hint:可选参数,指定索引。

使用场景

findOneAndUpdate() 方法通常用于对文档进行修改或更新,比如修改用户信息、更新商品库存等。该方法具有原子性,可以在单个操作中执行查询和修改两个操作,避免并发环境下的竞争问题。此外, findOneAndUpdate() 方法还支持事务操作,可以保证多个操作的一致性。

示例

下面的示例将查询一个文档,并将其 name 字段修改为 “Alice”:

db.users.findOneAndUpdate(
  { _id: ObjectId("60b8919f06c40a1e7557d583") },
  { $set: { name: "Alice" } },
  { returnDocument: "after" }
)

执行上述代码后,将返回更新后的文档。

下面的示例将查询一个文档,并将其 friends 数组中的 “Bob” 替换为 “David”:

db.users.findOneAndUpdate(
  { _id: ObjectId("60b8919f06c40a1e7557d583"), friends: "Bob" },
  { $set: { "friends.$": "David" } },
  { returnDocument: "after" }
)

执行上述代码后,将返回更新后的文档。

结论

findOneAndUpdate() 方法可以根据查询条件找到一个文档并对其进行修改或更新。该方法具有原子性,可以在单个操作中执行查询和修改两个操作,避免并发环境下的竞争问题。此外,该方法还支持事务操作。