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 of causal consistency across replica sets
查询期间维护的隔离性保证
您可以使用 level 参数指定读关注(read concern)设置。默认读关注(read concern)级别为 local。这意味着客户端会从其客户端的副本集节点返回数据,但不能保证该数据已写入所有副本集节点。
注意
较低的读关注(read concern)级别要求可能会减少延迟。
For more information about read concerns or read concern levels, see Read Concern in the MongoDB Server manual. For more detail on the read_concern type and definitions of the read concern levels, see Read Concern in the API documentation.
示例:设置聚合的读关注(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在运行查询时会读取副本集的哪个成员。
For more detailed API documentation, see the Read Preference API documentation.
下表显示了可用于自定义服务器评估成员的方式的选项:
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服务器手册中的可重试读取。要学习;了解有关支持的可重试写入操作的更多信息,请参阅MongoDB服务器手册中的可重试写入。
API 文档
要进一步了解本指南所提及的方法和类型,请参阅以下 API 文档: