文档菜单
文档首页
/ / /
Node.js 驱动
/ /

复合操作

本页

  • 概述
  • 内置方法

大多数数据库请求要么从数据库中读取数据,要么将数据写入数据库。然而,在某些情况下,您可能需要一个同时读取和写入数据的单一操作。

复合操作 在单个原子语句中结合读取和写入操作,因此在读取和后续写入之间数据不会发生变化。

如果您单独执行每个操作,另一个请求可能在读取和写入操作之间更改数据。这些数据更改可能不会阻止您的操作成功,但它们会使错误处理更加困难。当您的应用程序在任何处理阶段处理潜在的错误时,它可能变得脆弱且难以测试。

Node.js 驱动程序提供了以下方法来执行复合操作

  • findOneAndDelete()

  • findOneAndUpdate()

  • findOneAndReplace()

这些方法接受一个可选的options 对象,具有可配置的排序投影 选项。

您还可以设置 includeResultMetadata 选项以指定这些方法的返回类型。有关此选项的更多信息,请参阅本指南中的 includeResultMetadata 选项 部分。

findOneAndUpdate()findOneAndDelete() 方法接受 returnDocument 设置,该设置指定方法返回的是修改前的文档版本还是修改后的文档版本。

includeResultMetadata 选项决定了复合方法的返回类型。

此设置默认为 false,表示每个方法返回匹配的文档。如果没有文档匹配,每个方法返回 null。如果您将 includeResultMetadata 设置为 true,则方法返回一个包含找到的文档和元数据的 ModifyResult 类型。

假设一个集合只包含以下文档

{ _id: 1, x: "on" }

以下表格显示了 includeResultMetadata 选项的值如何改变 findOneAndDelete() 方法的返回类型

选项值
语法和输出
默认值: false

文档匹配

await coll.findOneAndDelete({ x: "on" });
{ _id: 1, x: 'on' }

没有文档匹配

await coll.findOneAndDelete({ x: "off" });
null
true
await coll.findOneAndDelete({ x: "on" }, { includeResultMetadata: true });
{ lastErrorObject: { n: 1 }, value: { _id: 1, x: 'on' }, ok: 1, ... }

返回

查询