对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

配置增删改查操作

在本指南中,您可以学习如何使用 Node.js 驱动程序来配置读取和写入操作。

您可以通过设置读取偏好来控制驱动程序如何路由读取操作。您还可以通过设置读关注写关注来控制驱动程序如何处理数据的一致性和持久性。读关注指定了在执行读取操作时数据所需的持久性级别,而写关注指定了驱动程序在副本集上等待写入操作确认的方式。

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

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

  • 事务

  • Database

  • Collection

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

提示

要了解有关读取和写入设置的更多信息,请参阅 MongoDB Server 手册中的以下指南:

本节介绍如何在每个级别配置读取和写入设置。

此示例演示如何通过将 MongoClientOptions对象传递给构造函数来设立MongoClient实例的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:

  • SECONDARY 读取偏好(read preference):读取操作从从节点(secondary node from replica set)副本集成员检索数据

  • local 读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员

  • 2 写关注(write concern):主节点 (primary node in the replica set)和一个从从节点(secondary node from replica set)副本集成员必须确认写入操作

const clientOptions = {
readPreference: ReadPreference.SECONDARY,
readConcern: { level: "local" },
writeConcern: { w: 2 },
};
const client = new MongoClient("mongodb://localhost:27017", clientOptions);

或者,您可以在连接 URI 中指定读取和写入设置,该 URI 作为参数传递给MongoClient构造函数:

const uri = "mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2";
const clientWithUri = new MongoClient(uri);

此示例演示如何通过将 TransactionOptions对象传递给 startTransaction() 方法来设立ACID 事务的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:

  • PRIMARY 读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据

  • majority 读关注(read concern):读取操作返回实例已写入大多数副本集成员的最新数据

  • 1 写关注(write concern):主节点 (primary node in the replica set)副本集成员必须确认写入操作

const transactionOptions = {
readPreference: ReadPreference.PRIMARY,
readConcern: { level: "majority" },
writeConcern: { w: 1 },
};
const session = client.startSession();
session.startTransaction(transactionOptions);

此示例设立如何通过将 DbOptions对象传递给 db() 方法来设置名为 test_database 的数据库的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:

  • PRIMARY_PREFERRED 读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据,如果从节点(secondary node from replica set)主节点 (primary node in the replica set)不可用,则从节点成员检索数据

  • available 读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员

  • majority 写关注(write concern):所有副本集成员中的大多数必须确认写入操作

const dbOptions = {
readPreference: ReadPreference.PRIMARY_PREFERRED,
readConcern: { level: "available" },
writeConcern: { w: "majority" },
};
const db = client.db("test_database", dbOptions);

此示例演示如何通过将 CollectionOptions对象传递给 collection() 方法来设立名为 test_collection 的集合的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。该代码配置以下设置:

  • SECONDARY_PREFERRED 读取偏好(read preference):读取操作从节点副本集成员检索数据,如果没有可用的从节点,则从从节点(secondary node from replica set)主节点 (primary node in the replica set)成员检索数据

  • available 读关注(read concern):读取操作返回实例的最新数据,但不保证该数据已写入大多数副本集成员

  • 0 写关注(write concern):不请求确认写入操作

const collOptions = {
readPreference: ReadPreference.SECONDARY_PREFERRED,
readConcern: { level: "available" },
writeConcern: { w: 0 },
};
const collection = db.collection("test_collection", collOptions);

在 MongoDB Server 中,您可以根据您选择的任何条件将键值标签应用于副本集成员。 然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。

默认情况下,Node.js 驱动程序在选择要读取的节点时会忽略标签。要指示 Node.js 驱动程序优先使用某些标签,请将它们作为参数传递给您的读取偏好类构造函数。

此代码示例将 readPreference 选项设置为一个标签集,指示 test_database 优先按以下顺序从从节点(secondary node from replica set)副本集成员读取:

  1. 来自纽约数据中心( { dc: 'ny' } ) 的成员

  2. 来自旧金山数据中心( { dc: 'sf' } ) 的成员

  3. 任何从节点(secondary node from replica set)( {} )

const taggedReadPreference = new ReadPreference(
ReadPreference.SECONDARY,
[
{ dc: "ny" },
{ dc: "sf" },
{}
]
);
const dbWithTags = client.db(
"test_database",
{ readPreference: taggedReadPreference }
);

连接到副本集时,并使用非主节点 (primary node in the replica set) 读取偏好(read preference),驱动程序会从延迟窗口内最近的符合条件的副本集读取。连接到分片集群时,驱动程序会从延迟窗口内所有可访问的 mongos 实例中进行选择。要了解读取偏好模式,请参阅 读取偏好(read preference)。

默认情况下,驱动程序仅使用网络探测(ping)时间在距离最近的符合条件的服务器 15 毫秒以内的服务器。

例如,假设您的副本集有五个节点,而最近的节点的网络探测(ping)时间为 5 毫秒。使用默认 localThresholdMS (15 毫秒),只有网络探测(ping)时间小于或等于 20 毫秒的节点才在延迟窗口内,如下表所示:

主机
类型
网络探测(ping)时间
延迟窗口内

host1

主节点

5 毫秒

host2

从节点

9 毫秒

host3

从节点

13 毫秒

host4

从节点

24 毫秒

No

host5

从节点

42 毫秒

No

要调整延迟窗口,请将 localThresholdMS 选项传递给 MongoClient() 构造函数。

以下示例指定了35毫秒的本地阈值:

const clientWithLocalThreshold = new MongoClient("mongodb://localhost:27017", {
replicaSet: "repl0",
readPreference: ReadPreference.SECONDARY_PREFERRED,
localThresholdMS: 35
});

在前面的示例中,Node.js驱动程序在最近节点的网络探测(ping)时间差的 35 毫秒内在匹配节点之间分发读取。

注意

通过 mongos实例与副本集通信时,Node.js驱动程序会忽略 localThresholdMS 的值。在这种情况下,请使用 localThreshold 命令行选项。

您可以指定排序规则来修改读取和写入操作的行为。排序规则是一设立特定于语言的字符串比较规则,例如字母大小写和重音符号规则。

MongoDB默认使用二进制排序规则对字符串进行默认。此默认规则使用ASCII 标准字符值对字符串进行比较和排序。语言和区域设置具有与 ASCII 标准不同的特定字符排序约定,您可以选择在操作中应用一设立不同的排序规则。

您可以在以下级别指定排序规则:

  • 集合:为集合上的操作设置默认规则。您无法为现有集合定义排序规则。

  • 索引:为使用索引的操作设置排序规则。

  • 操作:设置操作的排序规则并覆盖任何继承的排序规则。

排序规则对象包含以下字段:

collation: {
locale: <string>,
caseLevel: <bool>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <bool>,
alternate: <string>,
maxVariable: <string>,
backwards: <bool>
}

设置 collation 选项时,必须指定 locale字段。所有其他字段都是可选的。有关支持的区域设置以及 locale 字段默认值的完整列表,请参阅 MongoDB Server 手册中的支持的语言和区域设置

要指定排序规则,请创建一个 collation对象并将其 locale字段设立为要使用的语言排序规则。然后,将此对象作为选项参数传递给与目标排序规则级别对应的方法。

本节包括在集合、索引和操作级别设立排序规则的示例。

以下示例创建一个名为 names 的新集合,并将其默认规则设置为 "fr_CA"区域设置设置:

const db = client.db("db")
db.createCollection("names", {
collation: { locale: "fr_CA" },
});

您可以在指定不同排序规则的 names集合上创建索引,如以下示例所示:

const coll = db.collection("names");
coll.createIndex(
{ "last_name" : 1 },
{ "collation" : { "locale" : "en_US" } });

您可以对在上一节中创建的 names 集合运行覆盖默认默认规则的操作。

names 集合包含以下文档:

{ "_id" : 1, "first_name" : "Hans", "last_name" : "Muller" }
{ "_id" : 2, "first_name" : "Gunter", "last_name" : "Braun" }
{ "_id" : 3, "first_name" : "Günter", "last_name" : "Krause" }
{ "_id" : 4, "first_name" : "Jürgen", "last_name" : "Weber" }

此示例调用 findOneAndUpdate() 方法来更新第一个 first_name 值为 "Gunter" 的匹配文档。代码应用与 "de"区域设置和 "phonebook"区域设置设置变体的排序规则:

coll.findOneAndUpdate(
{ first_name: { $lt: "Gunter" } },
{ $set: { verified: true } },
{ collation: { locale: "de@collation=phonebook" } },
);

在前面的示例中,phonebook区域设置变体指示驱动程序将带变音符号的字符排序在不带变音符号的相同字符之前。因此,该操作会匹配 first_name 值为 "Günter"(带变音符号)的文档,并返回以下更新信息:

{ lastErrorObject: { updatedExisting: true, n: 1 },
value: { _id: 3, first_name: 'Günter', last_name: 'Krause' },
ok: 1 }

提示

要学习;了解有关区域设置设置变体的更多信息,请参阅MongoDB Server手册中的本地变体

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: