“文档” 菜单
文档首页
/ / /
Go 驱动程序
/ /

修改 CRUD 操作的执行

在此页面上

  • 概述
  • 写关注
  • 读关注 (read concern)
  • 读取偏好
  • 更多信息

在本指南中,您可以了解如何使用副本集的写关注读关注读取偏好配置来修改 MongoDB Go 驱动程序执行创建、读取、更新和删除 (CRUD) 操作的方式。

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

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

  • 会话级别

  • 事务级别

  • 数据库级别

  • 集合级别

在以下各节中,您可以了解如何自定义副本集中数据的一致性和可用性。

写关注(write concern)描述了副本集中承载数据的成员的数量,这些成员必须在操作成功返回之前确认写入操作(例如插入或更新)。默认情况下,写关注(write concern)只要求主节点副本集成员确认写入操作,然后操作被视为成功。

MongoDB Go 驱动程序提供了 writeconcern包,允许您为副本集指定写关注(write concern)。使用具有WriteConcern类型的SetWriteConcern()方法设置写关注(write concern)。WriteConcern类型具有以下方法来选择常见的写关注(write concern)规范:

方法
说明
Custom()
客户端请求确认写入操作传播到mongod实例的已标记成员。 有关更多信息,请参阅写关注规范

参数string
Journaled()
客户端请求确认将写入操作写入磁盘上日志。 有关更多信息,请参阅写关注规范

参数:无
Majority()
客户端请求确认写入操作传播到大多数数据承载有投票权成员。 有关更多信息,请参阅写关注规范

参数:无
Unacknowledged()
客户端请求无需确认写入操作。 有关更多信息,请参阅w: 0的写关注规范

参数:无
W1()
客户端请求确认写入操作已写入一个节点上的内存,例如独立运行的 mongod 或副本集中的主节点。 有关更多信息,请参阅w: 1的写关注规范

参数:无

如果需要更专门的写关注,则您可以自行定义 WriteConcern 结构文本。您可以在 WriteConcern 结构中设置以下字段:

字段
说明
W
指定写操作必须传播到进行确认的 mongod 实例或标记成员的数量。常用值包括 10"majority"

类型stringint
Journal
指定是否必须将写入操作写入磁盘日志以供确认。

类型bool
WTimeout
指定写关注的时间限制。此设置仅适用于W值大于1的情况。指定此设置并同时在客户端上指定超时会导致未定义的行为。要了解更多信息,请参阅wtimeout 的写关注规范

类型time.Duration

提示

您也可以在连接string中指定写关注。 有关更多信息,请参阅MongoDB Server手册中有关写关注选项的条目。

以下代码展示了如何在客户端和collection级别指定不同的写关注(write concern)。客户端级写关注(write concern)请求两个副本集成员的确认,并将日志设置为falsecollection写关注(write concern)请求副本集大多数成员的确认。

uri := "mongodb://<hostname>:<port>"
journal := false
cliWC := &writeconcern.WriteConcern{
W: 2,
Journal: &journal,
}
clOpts := options.Client().ApplyURI(uri).SetWriteConcern(cliWC)
client, err := mongo.Connect(context.TODO(), clOpts)
...
collWC := writeconcern.Majority()
collOpts := options.Collection().SetWriteConcern(collWC)
coll := client.Database("db").Collection("myColl", collOpts)

读关注选项可以让您确定客户端从查询中返回哪些数据。默认的读关注级别为“本地”,这意味着客户端会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。

MongoDB Go 驱动程序提供了 readconcern 包,可用于指定副本集的读关注。使用 SetReadConcern() 方法设置 ReadConcern 类型的读关注。ReadConcern 类型有以下方法来指定读关注:

方法
说明
Available()
查询从实例返回数据,但不保证数据已写入大多数副本集成员。 有关更多信息,请参阅读关注规范。
Linearizable()
该查询返回的数据反映了以写关注majority发出并在读操作开始之前确认的所有成功写入。 有关更多信息,请参阅读关注规范。
Local()
查询会返回实例的最新数据。 有关更多信息,请参阅读关注规范。
Majority()
该查询返回确认已写入副本集中大多数成员的实例的最新数据。 有关更多信息,请参阅读关注规范。
Snapshot()
该查询返回特定时间点mongod实例中数据的完整副本。 仅适用于多文档事务中的操作。 有关更多信息,请参阅读关注规范。

以下代码显示了如何指定“majority”的读关注(read concern)。然后,代码会选择带有此选项的Collection

rc := readconcern.Majority()
opts := options.Collection().SetReadConcern(rc)
database := client.Database("db")
coll := database.Collection("myCollection", opts)

读取偏好选项指定 MongoDB 客户端如何将读取操作路由到副本集成员。默认情况下,应用程序将其读取操作定向到副本集中的主节点。

读取偏好由读取偏好模式和可选的标签集列表maxStalenessSeconds选项和对冲读选项组成。

MongoDB Go 驱动程序提供了 readpref 包,它允许您为副本集指定读取偏好。使用类型为 ReadPrefSetReadPreference() 方法设置读取偏好。ReadPref 类型有以下方法来指定读取偏好:

方法
说明
Nearest()
客户端根据指定的延迟阈值从符合条件的随机副本集节点(主节点或从节点)读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
Primary()
客户端从当前副本集主节点读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
PrimaryPreferred()
在大多数情况下,客户端会从主节点读取数据。 如果主节点不可用,则操作将从节点成员读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
Secondary()
客户端从副本集的从节点读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。
SecondaryPreferred()
在大多数情况下,客户端会从节点读取数据。 如果从节点不可用,则操作将从主节点成员读取。 有关更多信息,请参阅MongoDB Server手册中的读取偏好条目。

提示

您也可以在连接string中指定读取偏好。 有关更多信息,请参阅MongoDB Server手册中有关读取偏好选项的条目。

以下代码显示如何将读取偏好指定到从节点的读取。然后代码使用此选项选择 Database

rp := readpref.Secondary()
opts := options.Database().SetReadPreference(rp)
database := client.Database("db", opts)

有关本指南中概念的更多信息,请参阅以下服务器文档:

← 复合运算符