配置增删改查操作
Overview
在本指南中,您可以学习;了解如何使用 Node.js驾驶员来配置读取和写入操作。
读取和写入设置
您可以通过设置读取偏好(read preference)控制驾驶员路由读取操作的方式。您还可以通过设置读关注(read concern)或写关注(write concern)来控制驾驶员处理数据一致性和持久性的方式。读关注指定执行读操作时数据所需的持久性级别,写入关注指定驾驶员如何等待副本集上的写入操作确认。
您可以在以下级别设置写关注、读关注和读取偏好选项:
客户端,为所有操作执行设置默认值,除非被覆盖
事务
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驾驶员优先选择某些标签,请将它们作为参数传递给读取偏好(read preference)构造函数。
此代码示例将 readPreference
选项设置为一个标签集,指示 test_database
优先按以下顺序从从节点(secondary node from replica set)副本集成员读取:
来自纽约数据中心(
{ dc: 'ny' }
) 的成员来自旧金山数据中心(
{ dc: 'sf' }
) 的成员任何从节点(secondary node from replica set)(
{}
)
const taggedReadPreference = new ReadPreference( ReadPreference.SECONDARY, [ { dc: "ny" }, { dc: "sf" }, {} ] ); const dbWithTags = client.db( "test_database", { readPreference: taggedReadPreference } );
LocalThreshold
如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配,Node.js驾驶员将从根据其网络探测(ping)时间选择的最近副本集成员中读取。
默认情况下,驱动程序仅使用 ping 时间与最近节点的 ping 时间在15毫秒以内的节点进行查询。 要在延迟较高的成员之间分配读取,请将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 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: