Overview
大多数数据库请求要么从数据库读取数据,要么将数据写入数据库。 但是,在某些实例下,您可能需要单个操作来读取和写入数据。
复合操作将读取和写入操作组合在单个原子声明中,因此在读取和后续写入之间不会发生数据更改。
如果单独执行每个操作,则另一个请求可能会在读取和写入操作之间更改数据。 这些数据更改可能不会阻止操作成功,但可能会使错误处理更加困难。 当应用程序在任何阶段处理潜在错误时,它都可能变得脆弱且难以测试。
内置方法
Node.js 驱动程序提供以下方法来执行复合操作:
这些方法接受带有可配置排序和投影选项的可选options对象。
You can also set the includeResultMetadata option to specify the return type of each of these methods. To learn more about this option, see the includeResultMetadata Option section of this guide.
findOneAndUpdate()和findOneAndDelete()方法采用returnDocument设置,该设置指定该方法是返回已修改帖子的更新前版本还是更新后版本。
includeResultMetadata 选项
includeResultMetadata选项确定复合方法的返回类型。
此设置默认为false ,这意味着每个方法都会返回匹配的文档。 如果没有匹配的文档,则每个方法都返回null 。如果将includeResultMetadata设置为true ,该方法将返回包含找到的文档和元数据的ModifyResult类型。
假设集合仅包含以下文档:
{ _id: 1, x: "on" }
下表显示了includeResultMetadata选项的值如何更改findOneAndDelete()方法的返回类型:
选项值 | 语法和输出 | ||
|---|---|---|---|
默认: | 匹配的文档 没有匹配的文档 | ||
| |