复合运算符
此版本的文档已存档,不再提供支持。 查看最新文档,了解如何升级您的 Node.js 驱动程序版本。
Overview
大多数数据库请求只需要从数据库读取数据或将数据写入数据库。 但是,客户端应用程序有时需要在与数据库的单次交互中读取和写入数据。
复合操作将读取和写入操作组合在单个原子声明中,因此在读取和后续写入之间数据不会发生变化;事实上,从客户端应用程序的角度来看,这两个操作发生在同一行代码中。
如果您想要写入特定文档,但尚未找到它,则此属性非常有用。 如果您只是读取文档的 _id
,然后尝试更改刚刚找到的文档,则其他人有可能在读取和写入操作之间更改该文档。 这并不能阻止您执行这项工作,但可能会使错误处理变得更加困难。 复合操作通过完全在数据库内的抽象层后面处理逻辑,帮助保持逻辑简单,因此您不必担心。 虽然您可以使用单独的读取和写入来完成此任务,但这样做需要客户端应用程序能够从容地处理流程任何阶段和多种潜在错误状态下的潜在错误。 这会增加代码的复杂性,并使客户端应用程序变得脆弱且难以测试。
内置方法
共有三种主要的复合操作:
findOneAndDelete() 将多个文档与提供的查询进行匹配,并删除第一个匹配的文档。
findOneAndUpdate() 将多个文档与提供的查询进行匹配,并使用提供的更新文档更新第一个匹配的文档。
findOneAndReplace() 将多个文档与提供的查询进行匹配,并使用提供的替换文档替换第一个匹配的文档。
所有三种方法都接受一个可选的options
对象,该对象具有可配置的排序和投影选项,其工作方式与相应的读取操作类似。 findOneAndUpdate()
和findOneAndDelete()
允许客户端配置returnDocument
选项,该选项是一个布尔值,用于确定该方法是返回已修改文档的帖子前版本还是帖子后版本。