Docs 菜单

Docs 主页开发应用程序MongoDB 驱动程序Node.js 驱动程序

指定增删改查操作在副本集上的运行方式

在此页面上

  • 概述
  • 写关注
  • 示例:为单个写入操作设置写关注(write concern)
  • 示例:检索并应用现有的写关注(write concern)
  • 读关注 (read concern)
  • 示例:设置聚合的读关注(read concern)级别
  • 示例:更改数据库的读关注(read concern)
  • 读取偏好
  • 示例:为事务设置读取偏好(read preference)和关注
  • 示例:在连接字符串中设置集群的读取偏好(read preference)
  • API 文档

在本指南中,您可以了解如何使用写关注(write concern)读关注(read concern)读取偏好(read preference)配置来修改 MongoDB 对副本集运行创建、读取、更新和删除 (CRUD) 操作的方式。

您可以在以下级别设置写关注、读关注和读取偏好选项:

  • 客户端,为所有操作执行设置默认值,除非被覆盖

  • 会话

  • 事务

  • 数据库

  • Collection

此列表还指示了选项设置的优先级递增顺序。 例如,如果为事务设置读关注级别,它将覆盖为客户端设置的读关注级别。

这些选项允许您自定义副本集中数据的因果一致性和可用性。

写关注(write concern)指定在写入操作(例如插入或更新)成功返回之前从 MongoDB 请求的确认级别。未指定显式写关注的操作会继承全局默认写关注设置。

有关更多信息,请参阅服务器手册中的 写关注 。有关详细的 API 文档,请参阅 WriteConcern API 文档。

下表描述了 WriteConcern参数:

范围
类型
说明
w (可选)
mongod请求确认写入操作已传播到指定数量的实例或带有指定标签的实例mongod
wtimeoutMS (可选)
数字
指定时间限制以防止写入操作无限期阻塞
journal (可选)
布尔
请求确认写入操作已写入磁盘上日志

此代码在创建新文档时使用自定义WriteConcern设置:

myDB.myCollection.insertOne(
{ name: "anotherDocumentName" },
{ writeConcern:
{ w: 2, wtimeoutMS: 5000 }
}
);

此代码使用fromOptions()方法从现有数据库引用myDB的选项构造WriteConcern }。 请注意, myDB可以替换为对任何接受写关注选项的实体的引用。 然后,将新的写关注应用于文档myDoc

const newWriteConcern = WriteConcern.fromOptions(myDB);
const myDoc = { name: "New Document" };
WriteConcern.apply(myDoc,newWriteConcern);

读关注(read concern)指定了以下行为:

您可以使用level参数指定读关注(read concern)设置。默认读关注(read concern)级别为local 。这意味着客户端会从其连接的副本集节点返回数据,但不能保证该数据已写入所有副本集节点。 请注意,较低的读关注(read concern)级别要求可能会减少延迟。

有关读关注或读关注级别的更多信息,请参阅服务器手册中的 读关注 。有关ReadConcern 类型和读关注级别定义的更多详细信息,请参阅 ReadConcern 在 API 文档中。

此代码将聚合的读关注级别设置为"majority"

const pipeline = [
{"$match": {
category: "KITCHENWARE",
}},
{"$unset": [
"_id",
"category",
]}
];
result = await myDB.collection("mycollection")
.aggregate(
pipeline,
{ readConcern:
{ level: "available" }
}
);

有关聚合的更多信息,请参阅聚合页面。

此代码将数据库的读关注(read concern)级别更改为"local"

const options = { readConcern: { level: "local" } };
const myDB = client.db("mydb", options);

读取偏好(read preference)决定了在运行查询时读取 MongoDB 副本集的哪个成员。您还可以自定义服务器评估成员的方式。

有关更详细的 API 文档,请参阅 ReadPreference API 文档。

下表描述了ReadPreference参数:

范围
类型
说明
mode
指定服务器从哪个副本集节点读取数据的要求或偏好。 默认模式primary指定操作从副本集的主节点成员读取。
tags (可选)
为从节点副本集成员分配标签,以自定义服务器对其进行评估的方式。 标签不能与primary读取偏好(read preference)模式设置一起使用。
options (可选)
设置各种选项,包括可根据您的读取偏好应用的对冲maxStalenessSeconds

此代码设置事务(transaction)中操作的读取偏好(read preference)、读关注(read concern)和写关注(write concern):

const transactionOptions = {
readPreference: "primary",
readConcern: { level: "local" },
writeConcern: { w: "majority" },
};
const session = client.startSession();
session.startTransaction(transactionOptions);
// ...
await session.commitTransaction();
await session.endSession();

有关事务的更多信息,请参阅事务。

此代码示例创建一个 MongoClient,在对集群执行查询时使用“从节点”读取偏好模式:

const uri = "mongodb+srv://<user>:<password>@<cluster-url>?readPreference=secondary&maxStalenessSeconds=120";
const client = new MongoClient(uri);

此示例还设置了maxStalenessSeconds选项。有关连接字符串选项的更多信息,请参阅手册中的连接字符串选项部分。

要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档:

← 复合运算符