Overview
在本指南中,您可以了解如何使用写关注(write concern)、读关注(read concern)和读取偏好(read preference)配置来修改 MongoDB 对副本集运行创建、读取、更新和删除 (CRUD) 操作的方式。
您可以在以下级别设置写关注、读关注和读取偏好选项:
客户端,为所有操作执行设置默认值,除非被覆盖
会话
事务
Database
Collection
前面的列表还指示了选项设置的优先级递增顺序。示例,如果为ACID 事务设立读关注(read concern)级别,它将覆盖为客户端设立的读关注(read concern)级别。
这些选项允许您自定义副本集中数据的因果一致性和可用性。
写关注
写关注(write concern)指定在写入操作(例如插入或更新)成功返回之前从 MongoDB 请求的确认级别。未指定显式写关注的操作会继承全局默认写关注设置。
有关更多信息,请参阅MongoDB Server手册中的 写关注。有关详细的API文档,请参阅写关注API文档。
下表描述了 write_concern
参数:
Parameter | 类型 | 说明 |
---|---|---|
| 整数或字符串 | 要求确认写入操作已传播到指定数量的 |
| 整型 | 指定时间限制,防止写入操作无限期阻塞。 |
| 布尔 | 请求确认写入操作已写入磁盘上日志。 |
示例:为单个写入操作设置写关注(write concern)
以下代码创建一个新文档并指定 w
和 wtimeout
写关注(write concern)设置:
client = Mongo::Client.new(['IP_ADDRESS_001:27017'], database: 'myDB') myDB = client.database myCollection = myDB[:myCollection] myCollection.insert_one( { name: 'anotherDocumentName' }, write: { w: 2, wtimeout: 5000 } )
示例:检索并应用现有的写关注(write concern)
以下代码使用 new_write_concern
方法从现有数据库引用 myDB
的选项构造 write_concern
。然后,将新的写关注(write concern)应用于插入的文档。
myDoc = { name: 'New Document' } new_write_concern = Mongo::WriteConcern.get(myDB.write_concern) myDB[:myCollection].with(write: new_write_concern).insert_one(myDoc)
注意
myDB
可以替换为对任何接受写关注(write concern)选项的实体的引用。
读关注 (read concern)
读关注(read concern)指定了以下行为:
您可以使用 level
参数指定读关注(read concern)设置。默认读关注(read concern)级别为 local
。这意味着客户端会从其客户端的副本集节点返回数据,但不能保证该数据已写入所有副本集节点。
注意
较低的读关注(read concern)级别要求可能会减少延迟。
有关读关注或读关注(read concern)级别的更多信息,请参阅MongoDB Server手册中的读关注。有关 read_concern
类型和读关注(read concern)级别定义的更多详细信息,请参阅API文档中的读关注。
示例:设置聚合的读关注(read concern)级别
以下代码将聚合的读关注(read concern)级别设置为 "available"
:
pipeline = [ { "$match" => { category: 'KITCHENWARE' } }, { "$unset" => ['_id', 'category'] } ] result = myCollection.aggregate(pipeline, read: { read_concern: { level: :available } })
提示
要学习;了解有关聚合操作的更多信息,请参阅 《使用聚合转换数据》指南。
示例:更改数据库的读关注(read concern)
以下代码将数据库的读关注(read concern)级别更改为 "local"
:
client = Mongo::Client.new(['IP_ADDRESS_001:27017'], database: 'mydb', read_concern: { level: :local }) myDB = client.database
读取偏好
读取偏好(read preference)决定了MongoDB在运行查询时会读取副本集的哪个成员。
有关更详细的API文档,请参阅读取偏好API文档。
下表显示了可用于自定义服务器评估成员的方式的选项:
Parameter | 类型 | 说明 |
---|---|---|
|
| 指定服务器从哪个副本集节点读取数据的要求或偏好。 默认模式 |
|
| 为从节点副本集成员分配标签,以自定义服务器对其进行评估的方式。 标签不能与 |
|
| 设置各种选项,包括可根据您的读取偏好应用的对冲和maxStalenessSeconds 。 |
示例:为事务设置读取偏好(read preference)和关注
以下代码设置ACID 事务中操作的读取偏好(read preference)、读关注(read concern)和写关注(write concern):
transaction_options = { read: { mode: :primary }, read_concern: { level: :local }, write_concern: { w: :majority } } session = client.start_session session.start_transaction(transaction_options) session.commit_transaction # ... rescue => e session.abort_transaction puts "Transaction aborted due to an error: #{e.message}" ensure session.end_session end
提示
要学习;了解有关事务的更多信息,请参阅 事务 指南。
示例:在连接字符串中设置集群的读取偏好(read preference)
此代码示例创建一个 MongoClient
,在对集群执行查询时,该 使用 secondary
读取偏好(read preference)模式:
uri = 'mongodb+srv://<user>:<password>@<cluster-url>' options = { read: { mode: :secondary, max_staleness: 120 } } client = Mongo::Client.new(uri, options) myDB = client.database
前面的示例还将 maxStalenessSeconds
选项设置为 120
。有关连接字符串选项的更多信息,请参阅MongoDB Server手册中的连接字符串选项部分。
可重试读取和写入
如果某些读取和写入操作由于网络或服务器错误而失败, Ruby驾驶员会自动重试一次。
在创建新客户端时,您可以通过将 retry_reads
或 retry_writes
选项设置为 false
来显式禁用现代可重试读取或可重试写入。设立为 false
时,将启用传统重试行为。
以下示例为客户端禁用现代可重试读取和写入:
uri = 'mongodb+srv://<user>:<password>@<cluster-url>' options = { retry_reads: false, retry_writes: false } client = Mongo::Client.new(uri, options) myDB = client.database
要学习;了解有关支持的可重试读取操作的更多信息,请参阅MongoDB Server手册中的可重试读取。要学习;了解有关支持的可重试写入操作的更多信息,请参阅MongoDB Server手册中的可重试写入。
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: