Docs 菜单
Docs 主页
/ / /
Ruby 驱动程序
/

配置增删改查操作

在本指南中,您可以了解如何使用写关注(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
类型
说明

w (可选)

整数或字符串

要求确认写入操作已传播到指定数量的 mongod 实例或带有指定标签的 mongod 实例。

wtimeoutMS (可选)

整型

指定时间限制,防止写入操作无限期阻塞。

journal (可选)

布尔

请求确认写入操作已写入磁盘上日志。

以下代码创建一个新文档并指定 wwtimeout写关注(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
}
)

以下代码使用 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)指定了以下行为:

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

注意

较低的读关注(read concern)级别要求可能会减少延迟。

有关读关注或读关注(read concern)级别的更多信息,请参阅MongoDB Server手册中的读关注。有关 read_concern 类型和读关注(read concern)级别定义的更多详细信息,请参阅API文档中的读关注

以下代码将聚合的读关注(read concern)级别设置为 "available"

pipeline = [
{ "$match" => { category: 'KITCHENWARE' } },
{ "$unset" => ['_id', 'category'] }
]
result = myCollection.aggregate(pipeline,
read: { read_concern: { level: :available } })

提示

要学习;了解有关聚合操作的更多信息,请参阅 《使用聚合转换数据》指南。

以下代码将数据库的读关注(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
类型
说明

mode

Symbol

指定服务器从哪个副本集节点读取数据的要求或偏好。 默认模式:primary指定操作从副本集的主节点成员读取。

tags (可选)

Array<Hash>

为从节点副本集成员分配标签,以自定义服务器对其进行评估的方式。 标签不能与:primary读取偏好(read preference)模式设置一起使用。

options (可选)

Hash

设置各种选项,包括可根据您的读取偏好应用的对冲maxStalenessSeconds

以下代码设置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

提示

要学习;了解有关事务的更多信息,请参阅 事务 指南。

此代码示例创建一个 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_readsretry_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 文档:

后退

事务